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

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

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

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

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

            以下是構(gòu)建一個 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 對象的效率比多個 Statement 對象更高,尤其是如果您必須多次執(zhí)行同一條語句而差別僅在于參數(shù)不同時更是如此。PreparedStatement 允許您將 SQL 語句“編譯”一次(盡管這種編譯第一次要消耗較多的時間),然后將它保存在高速緩存中,從而實現(xiàn)有效的重用。同時它也提供了可讀性更好的代碼。

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

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

            以下是一個創(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ù)
            在更新動態(tài)數(shù)據(jù)庫表和數(shù)據(jù)時常常會遺忘的一個方面,就是在向超過一個表示一個邏輯事務(wù)的表更新或插入數(shù)據(jù)時,這個事務(wù)應(yīng)該反映到所有的表中,或者在碰到事務(wù)失敗時,通過“回滾”該事務(wù)而在每一個表中都沒有反映。

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

            以下是構(gòu)建一個連接并設(shè)置其各個屬性參數(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();
          ?}
          }

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

          posted on 2006-07-25 23:53 心隨我動 閱讀(301) 評論(0)  編輯  收藏 所屬分類: Java
          網(wǎng)站流量統(tǒng)計:
          澳大利亞 ABC 在線英語廣播電臺
          主站蜘蛛池模板: 洛南县| 双城市| 上饶县| 万盛区| 汪清县| 青阳县| 睢宁县| 五峰| 翼城县| 太和县| 土默特右旗| 额尔古纳市| 姜堰市| 南涧| 泾源县| 周口市| 涞水县| 社旗县| 股票| 宜章县| 襄汾县| 永康市| 达孜县| 芷江| 浑源县| 乌兰浩特市| 保靖县| 红原县| 嘉义市| 新晃| 门源| 湟源县| 泸水县| 田东县| 罗山县| 海盐县| 辛集市| 沙湾县| 镇平县| 浮山县| 车致|