java Datasource,資料庫連接池

來源:互聯網
上載者:User

標籤:style   blog   io   os   ar   使用   java   sp   strong   

目前有多重方式建立資料庫連接池:JNDI,DBCP,C3P0等

為什麼需要串連池:

使用java API DriverManager.getConnection()建立資料庫連接,耗費記憶體和時間,即時性低;這種方式擷取的connection需要手動關閉,不然會耗費大量的記憶體資源;對於頻繁資料庫操作,這種方式會造成效能低,尤其web應用

資料庫連接池的功能:

負責建立、管理和分配資料庫連接。初始化資料庫連接池時,會建立一定數量的資料庫連接對象,並存放於資料庫連接池中。當請求串連資料庫時,串連池會分配處於空閑狀態的串連;資料庫連接不被使用時,會被串連池回收,並設定為空白閑狀態;當串連空閑時間大於在初始化串連池設定的串連空閑時間,串連池釋放該串連。

 

資料庫連接池介紹:

1、 JNDI

2、 C3p0

3、 Apache的Jakarta DBCP

4、 BoneCP

其中,sping架構依賴的第三方使用了c3p0和dbcp兩種方式;而bonecp號稱是速度最快的資料庫連接池。JNDI方式建立實現的datasource是真正實現了javax.sql.datasource;其他的三種方式都不是。下面的列表,列出了幾種方式的區別和不同:

序號

串連池名稱

依賴的jar包

實現的datasource類

備忘

1

JNDI

該資料來源是由相應的web伺服器(例如:tomcat,weblogic,websphere)負責初始化,建立,管理。程式中不需要引入特別的jar包。

Javax.sql.datasource

 

2

C3P0

c3p0-0.9.xxx.jar

com.mchange.v2.c3p0.ComboPooledDataSource

 

3

DBCP

commons-dbcp.jar,commons-pool.jar

org.apache.commons.dbcp.BasicDataSource

 

4

BoneCP

 

bonecp-0.6.5.jar

· google-collections-1.0.jar

· slf4j-api-1.5.11.jar

· slf4j-log4j12-1.5.11.jar

·log4j-1.2.15.jar

 

BoneCPDataSource

 

備忘:以上幾種方式的資料庫連接池的配置參數大同小異,略有差別;其參數的配置,既可以通過設定檔的方式配置,也可以通過硬式編碼方式配置。

 

1,使用JNDI方式

這種方式,是由web伺服器實現了java.sql.datasource。由web伺服器負責初始化資料來源,建立connection,分配,管理connection。由於本身是由web伺服器實現的功能,因此不需要在項目project中引入特別的jar包,但是需要在伺服器的某些設定檔中增加相關的配置。下面,以tomcat伺服器為例,講述這種方式的使用。

    (1)、修改tomcat的conf下的context.xml檔案,增加Resource的配置的支援。

    (2)、由於資料來源是由tomcat負責建立,所以需要的jdbc驅動應該放到tomcat的lib路徑下。

    (3)、編寫使用java代碼,並放在tomcat環境下使用,如下:

 

public void jnditest(){

       // TODO Auto-generated method stub

       try {

           Context initcontext=new InitialContext();

           Context context=(Context) initcontext.lookup("java:comp/env");

          

 

           DataSource datasource=(DataSource)context.lookup("jdbc/editortest");

          

           Connection cn=datasource.getConnection();

          

           Statement st=cn.createStatement();

           String sql="select * from artical where id=1";

           ResultSet rs=st.executeQuery(sql);

           while(rs.next()){

              System.out.println("1:"+rs.getString(1));

              System.out.println("2:"+rs.getString(2));

              System.out.println("3:"+rs.getString(3));

              System.out.println("4:"+rs.getString(4));    

           }

       } catch (NamingException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

    }

 

        (4)、詳情參考jndisql。Java檔案,以及index.jsp。

 

注意:該測試不能在main方法中測試;可以寫一個jsp在tomcat環境中測試。因為:java單元的環境是jdk;而jsp的環境卻是tomcat;資料連線池是在tomcat中配置的,所以能正常啟動並執行,但java測試的環境只有jdk,所以在引用資料連線池時就時出現找不到環境的錯誤。

使用環境:當使用weblogic或者websphere等進階的web伺服器的時候,可以考慮使用這種方式提高效能。

3、 使用C3p0方式

C3P0是開源的資料庫連接組件,支援建立資料庫連接池,管理connection等功能。使用該種方式做資料庫連接時候,需要匯入c3p0-0.9.1.2.jar。

同時,關於資料庫連接的具體參數,例如:url,username,password,最小串連數,最大串連數。。。。。等資訊既可以在xml設定檔中配置,也可以通過程式編碼方式建立。Spring支援c3p0的資料庫連接池方式,因此在spring環境中使用時,支援在applicationcontext.xml檔案中配置。另外,由於資料庫連接池在整個project中針對某個資料庫而言是單例的,所以,即使通過編碼的方式建立,那麼要保證其單一實例特性。如果存在多個,那麼必然會導致效能低下。

下面,列出通過程式編碼方式使用c3p0資料庫連接池的方式。

ComboPooledDataSource ds = new ComboPooledDataSource();

       try {

           ds.setDriverClass("com.mysql.jdbc.Driver");

           ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");

           ds.setUser("root");

           ds.setPassword("123456");

           ds.setMaxPoolSize(20);

           ds.setInitialPoolSize(10);

           ds.setMaxIdleTime(2000);

           Connection cn=ds.getConnection();

           Statement st=cn.createStatement();

           String sql="select * from artical where id=1";

           ResultSet rs=st.executeQuery(sql);

           while(rs.next()){

              System.out.println("1:"+rs.getString(1));

               System.out.println("2:"+rs.getString(2));

              System.out.println("3:"+rs.getString(3));

              System.out.println("4:"+rs.getString(4));    

           }

          

       } catch (PropertyVetoException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

    }

    備忘:通常使用方式,都是通過設定檔配置,幾乎不會用到這種寫入程式碼方式。在此,只是簡單介紹C3P0的使用方式。詳情,可以參考c3p0test.java。

 

4、 使用dbcp方式

DBCP方式,是apache提供的資料來源串連池方式,支援資料庫連接池建立,管理connection等功能。使用環境,需要匯入commons-dbcp.jar 和 commons-pool.jar兩個jar包。上面提到的JNDI方式,其實質實用的就是dbcp資料來源;只是他是通過在web伺服器上做配置,由web伺服器負責建立該資料來源。

同樣的,dbcp資料來源也支援xml設定檔和寫入程式碼兩種方式。通常使用方式,都是通過設定檔配置,幾乎不會使用寫入程式碼方式。下面簡單介紹dbcp方式的編碼:

BasicDataSource ds = new BasicDataSource();

       ds.setDriverClassName("com.mysql.jdbc.Driver");

       ds.setUrl("jdbc:mysql://localhost:3306/editortest");

       ds.setUsername("root");

       ds.setPassword("123456");

       ds.setMaxIdle(20);

       ds.setInitialSize(10);

       ds.setMaxActive(2000);

       try {

           Connection cn=ds.getConnection();

           Statement st=cn.createStatement();

           String sql="select * from artical where id=1";

           ResultSet rs=st.executeQuery(sql);

           while(rs.next()){

              System.out.println("1:"+rs.getString(1));

              System.out.println("2:"+rs.getString(2));

              System.out.println("3:"+rs.getString(3));

              System.out.println("4:"+rs.getString(4));    

           }

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

    }

5、 使用BoneCP方式。

BoneCP是快速高效的資料庫連接池組件,據說效能上目前是最好得,比C3P0和DBCP快25倍。使用該組件,需要匯入bonecp-0.6.5.jar,google-collections-1.0.jar,slf4j-api-1.5.11.jar,slf4j-log4j12-1.5.11.jar,log4j-1.2.15.jar。

下面,簡單列出編碼方式的使用,做簡單的瞭解。

BoneCPDataSource ds = new BoneCPDataSource();

       ds.setDriverClass("com.mysql.jdbc.Driver");

       ds.setJdbcUrl("jdbc:mysql://localhost:3306/editortest");

       ds.setUsername("root");

       ds.setPassword("123456");

      

       try {

           Connection cn = ds.getConnection();

           Statement st = cn.createStatement();

           String sql = "select * from artical where id=1";

           ResultSet rs = st.executeQuery(sql);

           while (rs.next()) {

              System.out.println("1:" + rs.getString(1));

              System.out.println("2:" + rs.getString(2));

               System.out.println("3:" + rs.getString(3));

              System.out.println("4:" + rs.getString(4));

           }

       } catch (SQLException e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

    }

 

總結:以上,介紹了幾種常用的資料來源串連池;這幾種串連池在使用過程,即支援硬式編碼方式,也支援設定檔的配置方式;在正式實用的時候,應該盡量使用配置的方式,便於維護和管理。硬式編碼方式,可以做為測試使用。同時,spring架構,通過他自己的方式整合上述幾種資料來源,理論上來說,都支援。各個資料來源串連池都有一些公有的屬性,因為他們都是從javax.sql.datasource繼承而來,而且都有最大串連數,初始化串連數等概念。同時,他們又分別有各自不同的屬性,做了擴充。這裡只是簡單的介紹,在實際使用中,想要實現高效能的資料庫連接池管理,還需要深入研究每種方式的串連屬性配置;例如:根據實際需要,設定合適的最小串連數和最大串連數,等待時間等。

 

 

註:資料庫連接池要保證串連池的單例

 

java Datasource,資料庫連接池

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.