一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JNDI與JDBC比較以及連接池的技術(shù) - Do-websoftware - 博客園

 汲取者 2010-04-21

JNDI與 JDBC比較以及連接池的技術(shù)

       Java Database Connectivity(JDBC)JDBC以一種統(tǒng)一的方式來(lái)對(duì)各種各樣的數(shù)據(jù)庫(kù)進(jìn)行存取。和ODBC一 樣,JDBC為開(kāi)發(fā)人員隱藏了不同數(shù)據(jù)庫(kù)的不同特性。另外,由于JDBC建立在Java的 基礎(chǔ)上,因此還提供了數(shù)據(jù)庫(kù)存取的平臺(tái)獨(dú)立性。JDBC定義了4種不同的 驅(qū)動(dòng)程序:JDBC-ODBCBridge、JDBC-native driverbridge、JDBC-networkbridge、PureJavadriver。在一個(gè)多層的企業(yè)級(jí)應(yīng)用中,更大的可能是在客戶端和一個(gè)EJB進(jìn)行通信,采用EJB建 立數(shù)據(jù)庫(kù)連接。為了實(shí)現(xiàn)和改進(jìn)可伸縮性和系統(tǒng)性能, 也可以采用連接緩沖 池(connection pool)優(yōu)化數(shù)據(jù)庫(kù)連接。

Java Naming and Directory Interface (JNDI)JNDI API被用于執(zhí)行名字和目錄服務(wù)。它提供了一致的模型來(lái)存取和操作企業(yè)級(jí)的資源如DNSLDAP,本地 文件系統(tǒng),后者在應(yīng)用服務(wù)器中的對(duì)象。在JNDI中,在目錄結(jié)構(gòu)中的每一 個(gè)結(jié)點(diǎn)稱為context。每一個(gè)JNDI名字都是相對(duì)于context的。應(yīng)用可以通過(guò)這個(gè)初始化的context經(jīng)有這個(gè)目錄樹(shù)來(lái) 定位它所需要的資源或?qū)ο蟆?/span>

JNDI相對(duì)與JDBC來(lái)說(shuō)是他的靈活性,程 序員不需要關(guān)心“具體的數(shù)據(jù)庫(kù)后臺(tái)是什么?JDBC驅(qū)動(dòng)程序是什么?JDBC URL格式是什么?訪問(wèn)數(shù)據(jù)庫(kù)的用戶名和口令是什么?”等等這些問(wèn)題,程序員編寫的程 序應(yīng)該沒(méi)有對(duì) JDBC 驅(qū)動(dòng)程序的引用,沒(méi)有服務(wù)器名稱,沒(méi)有用戶名稱 或口令 —— 甚至沒(méi)有數(shù)據(jù)庫(kù)池或連接管理。而是把這些問(wèn)題交給J2EE容器來(lái)配置和管理,程序員只需要對(duì)這些配置和管理進(jìn)行引用即可。

理解連接池

連接池是創(chuàng)建和管理多個(gè)連接的一種技術(shù),這些連接可被需要使用它們的任何線程使 用。連接池技術(shù)基于下述事實(shí):對(duì)于大多數(shù)應(yīng)用程序,當(dāng)它們正在處理通常需要數(shù)毫秒完成的事務(wù)時(shí),僅需要能夠訪問(wèn)JDBC連接的1個(gè)線程。未 處理事務(wù)時(shí),連接處于閑置狀態(tài)。使用連接池,允許其他線程使用閑置連接來(lái)執(zhí)行有用的任務(wù)。

事實(shí)上,當(dāng)某一線程需要用JDBCMySQL或其他 數(shù)據(jù)庫(kù)上執(zhí)行操作時(shí),需要用到由連接池提供的連接。使用連接完成線程后,線程會(huì)將連接返回給連接池,以便該連接能夠被其他需要使用連接的線程使用。

從連接池“借出”連接時(shí),該連接僅供請(qǐng)求它的線程使用。從編程觀點(diǎn)看,其效果等同 于每次需要JDBC連接時(shí)調(diào)用DriverManager.getConnection(),但是,采用連接池技術(shù),可通過(guò)使用新的或已有的連接結(jié)束線程。

連接池技術(shù)能顯著增加Java應(yīng)用程序的性能,同時(shí)還能降低資源使用率。連接池技術(shù)的主要優(yōu)點(diǎn)包括:

·         縮短了連接創(chuàng)建時(shí)間

與其他數(shù)據(jù)庫(kù)相比,MySQL提供了快速的連接設(shè)置功能,連接時(shí)間通常不是問(wèn)題,但創(chuàng)建新的JDBC連接仍會(huì)導(dǎo)致聯(lián)網(wǎng)操作和一定的IDBC驅(qū)動(dòng)開(kāi)銷,如果這類連接是“循環(huán)”使用的,使用該方式,可避免這類不利因素。

·簡(jiǎn)化的編程模型

使用連接池技術(shù)時(shí),每個(gè)單獨(dú)線程能夠像創(chuàng)建了自己的JDBC連接那樣進(jìn)行操作,從而允許使用直接的JDBC編程技術(shù)。

·受控的資源使用

如果不使用連接池技術(shù),而是在每次需要時(shí)為線程創(chuàng)建新的連接,那么應(yīng)用程序的資源 使用將十分浪費(fèi),而且在負(fù)載較重的情況下會(huì)導(dǎo)致無(wú)法預(yù)期的結(jié)果。

注意,與MySQL的每個(gè)連接均會(huì)在客戶端和服務(wù)器端造成一定的開(kāi)銷(每寸、CPU、關(guān)聯(lián)轉(zhuǎn)換等)。每個(gè)連接均會(huì)對(duì)應(yīng)用程序和MySQL服務(wù)器的可用資源帶來(lái)一定的限制。無(wú)論連接是否執(zhí)行任何有用的任務(wù),仍將使用這些資源中的相當(dāng)一部 分。

連接池能夠使性能最大化,同時(shí)還能將資源利用控制在一定的水平之下,如果超過(guò)該水 平,應(yīng)用程序?qū)⒈罎⒍粌H僅是變慢。

幸運(yùn)的是,Sun公司通過(guò)JDBC-2.0“可選”接口,完成了JDBC中連接池概念的標(biāo)準(zhǔn)化實(shí)施,所有 主要應(yīng)用服務(wù)器均實(shí)施了能夠與MySQL Connector/J一起良 好工作的這類API

通常,你可以在應(yīng)用服務(wù)器的配置文件中配置連接池,并通過(guò)Java命名和目錄接口(JNDI)訪問(wèn)它。在下面的代碼中,介紹了在J2E應(yīng)用服務(wù)器上運(yùn)行的 應(yīng)用程序中使用連接池的方法:

示例26.12. J2EE應(yīng)用服務(wù) 器一起使用連接池

import java.sql.Connection;

import java.sql.SQLException;

import java.sql.Statement;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class MyServletJspOrEjb {

    public void doSomething() throws Exception {

        /*

         * Create a JNDI Initial context to be able to

         * lookup the DataSource

         *

         * In production-level code, this should be cached as

         * an instance or static variable, as it can

         * be quite expensive to create a JNDI context.

         *

         * Note: This code only works when you are using servlets

         * or EJBs in a J2EE application server. If you are

         * using connection pooling in standalone Java code, you

         * will have to create/configure datasources using whatever

         * mechanisms your particular connection pooling library

         * provides.

         */

        InitialContext ctx = new InitialContext();

         /*

          * Lookup the DataSource, which will be backed by a pool

          * that the application server provides. DataSource instances

          * are also a good candidate for caching as an instance

          * variable, as JNDI lookups can be expensive as well.

          */

        DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB");

        /*

         * The following code is what would actually be in your

         * Servlet, JSP or EJB 'service' method...where you need

         * to work with a JDBC connection.

         */

        Connection conn = null;

        Statement stmt = null;

        try {

            conn = ds.getConnection();

            /*

             * Now, use normal JDBC programming to work with

             * MySQL, making sure to close each resource when you're

             * finished with it, which allows the connection pool

             * resources to be recovered as quickly as possible

             */

            stmt = conn.createStatement();

            stmt.execute("SOME SQL QUERY");

            stmt.close();

            stmt = null;

            conn.close();

            conn = null;

        } finally {

            /*

             * close any jdbc instances here that weren't

             * explicitly closed during normal code path, so

             * that we don't 'leak' resources...

             */

            if (stmt != null) {

                try {

                    stmt.close();

                } catch (sqlexception sqlex) {

                    // ignore -- as we can't do anything about it here

                }

                stmt = null;

            }

            if (conn != null) {

                try {

                    conn.close();

                } catch (sqlexception sqlex) {

                    // ignore -- as we can't do anything about it here

                }

                conn = null;

            }

        }

    }

}

如上例所示,獲得JNDI InitialContext并查找到數(shù)據(jù)庫(kù)后,其余代碼與過(guò)去在JDBC編程中使用的類似。

使用連接池時(shí)需要牢記的最重要事項(xiàng)是,無(wú)論在代碼中出現(xiàn)了什么(異常、控制流 等),連接以及由連接創(chuàng)建的任何部分(語(yǔ)句、結(jié)果集等)均應(yīng)被關(guān)閉,以便能再次使用它們。如不然,它們將糾纏在一起,在最好的情況下,意味著它們所代表的MySQL服務(wù)器資源(緩沖區(qū)、鎖定、套接字等)可能會(huì)捆綁一段時(shí)間,在最壞的情況下,可能會(huì)導(dǎo)致永久捆綁。

連接池的最佳大小是什么?

與所有其他配置經(jīng)驗(yàn)規(guī)則一樣,回答是“它取決于具體情況”。盡管最佳大小取決與預(yù) 期的負(fù)載和平均的數(shù)據(jù)庫(kù)事務(wù)時(shí)間,最佳的連接池大小小于你的預(yù)期。例如,如果使用的是Sun公司的Java Petstore Blueprint應(yīng)用程序,對(duì)于包含1520個(gè)連接的連接池,使用MySQLTomcat, 在可接受的相應(yīng)時(shí)間下,可服務(wù)于中等程度的負(fù)載(600個(gè)并發(fā)用戶)。

要想確定用于應(yīng)用程序的連接池大小,應(yīng)使用諸如Apache JmeterThe Grinder等工具創(chuàng)建負(fù)載測(cè)試腳本,并對(duì)應(yīng)用程序進(jìn)行負(fù)載測(cè)試。

確定出發(fā)點(diǎn)的一種簡(jiǎn)單方法是,將連接池的最大連接數(shù)配置為“無(wú)限”,運(yùn)行負(fù)載測(cè) 試,并測(cè)量最大的并發(fā)連接數(shù)。隨后,應(yīng)進(jìn)行反向操作,確定出使應(yīng)用程序具有最佳性能的連接池的最小和最大值。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    人妻久久一区二区三区精品99| 日本少妇中文字幕不卡视频| 欧美成人一区二区三区在线 | 日本亚洲精品在线观看| 午夜福利视频六七十路熟女| 91插插插外国一区二区婷婷| 国产精品不卡一区二区三区四区| 在线视频免费看你懂的| 男女午夜视频在线观看免费| 日韩一本不卡在线观看| 久草精品视频精品视频精品| 精品日韩中文字幕视频在线| 国产成人午夜av一区二区| 成年人免费看国产视频| 欧美日韩精品视频在线| 在线免费看国产精品黄片| 免费一级欧美大片免费看| 欧美亚洲三级视频在线观看| 午夜久久精品福利视频| 亚洲国产精品久久琪琪| 91久久精品中文内射| 日本黄色高清视频久久| 亚洲精品中文字幕一二三| 久久亚洲午夜精品毛片| 亚洲视频在线观看免费中文字幕| 国产av天堂一区二区三区粉嫩| 日韩不卡一区二区在线| av在线免费播放一区二区| 久久精品亚洲欧美日韩| 91午夜少妇极品福利| 91亚洲精品综合久久| 五月婷婷亚洲综合一区| 久久精品国产99精品最新| 男人大臿蕉香蕉大视频| 黄片美女在线免费观看| 欧美丝袜诱惑一区二区| 国产亚洲精品岁国产微拍精品| 日韩中文字幕有码午夜美女| 麻豆视频传媒入口在线看| 欧美日韩国产另类一区二区| 成人精品日韩专区在线观看|