<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 36,comments - 31,trackbacks - 0
    ??????企業(yè)數(shù)據(jù)庫(kù)連接性的恰當(dāng)構(gòu)建是非常重要的,并且在為有限連接設(shè)備配置(Connection Limited Device Configuration(CLDC))構(gòu)建應(yīng)用程序和編寫(xiě)特定于 MIDP(移動(dòng)接口)的接口之間,哪一種是最佳選擇取決于 J2ME 和 Java 技術(shù)。

      方式
      介紹在把企業(yè)數(shù)據(jù)橋接到無(wú)線移動(dòng)設(shè)備時(shí)建立 JDBC 連接的一條簡(jiǎn)單原則,這可以幫助您使解決方案具有更好的可擴(kuò)展性和更高效的性能。

      連接池
      任何應(yīng)用程序都必須先訪問(wèn)活動(dòng)的數(shù)據(jù)庫(kù)連接,然后才能訪問(wèn)數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)連接是一個(gè)很占資源且 I/O 開(kāi)銷(xiāo)很大的操作,并且如果每次想使用數(shù)據(jù)庫(kù)連接時(shí)都必須創(chuàng)建它,那么它將會(huì)成為您的性能瓶頸。

      例如,如果您使用 Java servlet(Java servlet 通過(guò) init() 方法創(chuàng)建并在其生命周期結(jié)束時(shí)被銷(xiāo)毀(通過(guò) destroy() 方法))的方式,您是雖然避免了每次 servlet 被實(shí)例化時(shí)重新建立連接。這樣一種方式會(huì)明顯地降低應(yīng)用程序的性能。完成相同功能的更好的途徑是使用“連接池(Connection Pool)”,您可以在連接池中初始化多個(gè)連接(并且參數(shù)可以從 XML 配置文件中讀取)。

      連接本身由一組集合對(duì)象和一個(gè)在整個(gè)請(qǐng)求過(guò)程中使連接保持打開(kāi)的用戶請(qǐng)求組成。創(chuàng)建連接池的關(guān)鍵是在數(shù)據(jù)庫(kù)訪問(wèn)代碼中使用如下一些塊:try{}.. catch{}... finally{}..。然后您使用 close() 方法來(lái)確認(rèn)連接確實(shí)被返回到了連接池而不是被徹底關(guān)閉了。在“finally{}”塊中指定 close() 方法使得執(zhí)行過(guò)程中發(fā)生的異常會(huì)被捕獲到,并且該語(yǔ)句仍被執(zhí)行 — 連接返回到連接池,這就防止了應(yīng)用程序中“連接泄漏(connection leak)”的發(fā)生。

      以下是構(gòu)建一個(gè) JDBC 連接的示例:

    Connection con = null;
    try {? ds = (DataSource)myContext.lookup("<specify JDBC driver>");
    ??pooledCon = ds.getConnection("scott", "tiger");
    ?// Processing Code goes here
    } catch (Exception ignored) {
    ?// catch JNDI or JDBC exceptions here
    } finally {
    ?if(pooledCon != null)
    ? ?pooledCon.close();
    }

      使用 PreparedStatement
      人們認(rèn)為 PreparedStatement 對(duì)象的效率比多個(gè) Statement 對(duì)象更高,尤其是如果您必須多次執(zhí)行同一條語(yǔ)句而差別僅在于參數(shù)不同時(shí)更是如此。PreparedStatement 允許您將 SQL 語(yǔ)句“編譯”一次(盡管這種編譯第一次要消耗較多的時(shí)間),然后將它保存在高速緩存中,從而實(shí)現(xiàn)有效的重用。同時(shí)它也提供了可讀性更好的代碼。

      另一個(gè)額外的優(yōu)勢(shì)是由驅(qū)動(dòng)程序完成的對(duì)用戶傳遞給語(yǔ)句的字符串的自動(dòng)轉(zhuǎn)義。舉例來(lái)說(shuō),這意味著當(dāng)您試圖將字符串“D'Marco”插入到一個(gè)基于字符的數(shù)據(jù)域(它可能是 VARCHAR, VARCHAR2, CHAR 等)中時(shí),SQL 語(yǔ)句不會(huì)在遇到第一個(gè)撇號(hào)時(shí)就產(chǎn)生災(zāi)難性的失敗。

      使用 PreparedStatement 對(duì)象時(shí)的另一個(gè)良好習(xí)慣是調(diào)用對(duì)象自身的 close() 方法來(lái)“關(guān)閉對(duì)象”,這個(gè)方法將被用來(lái)運(yùn)行 SQL 語(yǔ)句。這會(huì)關(guān)閉任何與正在執(zhí)行的 SQL 語(yǔ)句相關(guān)聯(lián)的游標(biāo),這樣就能防止打開(kāi)的游標(biāo)把數(shù)據(jù)庫(kù)弄得十分凌亂。

      以下是一個(gè)創(chuàng)建 PreparedSatement 的示例:

    PreparedStatement sqlstmt = dbCon.prepareStatement("select *
    from table1 where field_1=?");
    sqlstmt.setInt(1, 12);
    ResultSet rs = sqlstmt.executeQuery();
    // close the resultset statement to avoid hanging cursors in database
    sqlstmt.close();
    // processing of new statement
    sqlstmt = dbCon.prepareStatement("select * from table2 where field_2 = ?");
    // repeat creating the result set

      恰當(dāng)?shù)乩檬聞?wù)
      在更新動(dòng)態(tài)數(shù)據(jù)庫(kù)表和數(shù)據(jù)時(shí)常常會(huì)遺忘的一個(gè)方面,就是在向超過(guò)一個(gè)表示一個(gè)邏輯事務(wù)的表更新或插入數(shù)據(jù)時(shí),這個(gè)事務(wù)應(yīng)該反映到所有的表中,或者在碰到事務(wù)失敗時(shí),通過(guò)“回滾”該事務(wù)而在每一個(gè)表中都沒(méi)有反映。

      一些核心的 JDBC 包支持了四種事務(wù)隔離模式(transaction isolation mode),這些模式允許程序指定它們想事務(wù)表現(xiàn)出怎樣的行為。大多數(shù)程序都至少支持兩種模式:“讀取提交(read committed)”(缺省值)和“可序列化的(serializable)”。當(dāng)不可重復(fù)讀取應(yīng)該允許在多個(gè)查詢之間由一個(gè)事務(wù)作出的修改對(duì)于另一個(gè)事務(wù)可見(jiàn)時(shí),請(qǐng)使用“讀取提交”;要使由另一個(gè)事務(wù)作出的修改在一個(gè)查詢運(yùn)行時(shí)成為可見(jiàn)的,請(qǐng)使用幻象讀取(phantom read)。當(dāng)您需要一個(gè)跨多個(gè)操作前后完全一致的數(shù)據(jù)庫(kù)視圖時(shí),就應(yīng)該使用更為嚴(yán)格的“可序列化的”設(shè)置。把連接的自動(dòng)提交設(shè)置為“假”(autocommit = "false"),記住這一點(diǎn)是很有用的。

      以下是構(gòu)建一個(gè)連接并設(shè)置其各個(gè)屬性參數(shù)的示例:

    Connection con = null;
    try {
    ?dtsr = (DataSource <the JDBC driver you use>");
    ?pConn = dtsr.getConnection("<specify login>", "<specify password>");
    ?pConn.setAutoCommit(false); // transaction are not committed uponm execution

    ?pConn.setTransactionIsolation(
    ?Connection.TRANSACTION_SERIALIZABLE);
    ?// pConn is pooled connection
    ?pConn.commit();
    } catch (Exception ignored) {
    ?try { pConnn.rollback(); } catch (SQLException esgl) {}
    } finally {
    ?if(pConn != null) {
    ??? pConn.setAutoCommit(true); //reset autocommit
    ?? pConn.close();
    ?}
    }

      您也可以利用一個(gè)可選的 JDBC 包 — JTA(Java Transaction API),它允許容易地和完全獨(dú)立的事務(wù)服務(wù)器進(jìn)行集成。

    posted on 2006-07-25 23:53 心隨我動(dòng) 閱讀(296) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java
    網(wǎng)站流量統(tǒng)計(jì):
    澳大利亞 ABC 在線英語(yǔ)廣播電臺(tái)
    主站蜘蛛池模板: 亚洲ts人妖网站| 亚洲成a人片在线观看中文动漫| 伊人免费在线观看| 亚洲成年看片在线观看| 美女羞羞喷液视频免费| 免费福利在线视频| 亚洲国产成人精品不卡青青草原| 99999久久久久久亚洲| 毛片免费vip会员在线看| 亚洲欧美第一成人网站7777| 国产精品免费看久久久久| 日本精品久久久久久久久免费 | 一区二区三区AV高清免费波多| 国产一级高清视频免费看| 亚洲尹人香蕉网在线视颅| 亚洲精品视频在线观看免费| 亚洲国产精品人久久电影| 国产精品黄页免费高清在线观看| 超清首页国产亚洲丝袜| 男人的天堂av亚洲一区2区| 国产在线不卡免费播放| 国产精品偷伦视频免费观看了 | a级片在线免费看| 亚洲激情在线视频| 野花高清在线观看免费完整版中文| 中文字幕亚洲综合久久综合| 丁香亚洲综合五月天婷婷| 亚洲特级aaaaaa毛片| 特级无码毛片免费视频尤物| 亚洲欧洲自拍拍偷午夜色| 国产精品极品美女免费观看| 精精国产www视频在线观看免费| 免费中文字幕不卡视频| 中文字幕乱码一区二区免费| 在线观看亚洲成人| 亚洲毛片在线免费观看| 老子影院午夜伦不卡亚洲| 免费观看理论片毛片| 韩国免费A级毛片久久| 久久精品国产亚洲AV久| 亚洲综合AV在线在线播放|