標籤: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,資料庫連接池