三種數據庫連接池的配置及使用(For JDBC)

原文鏈接

DBCP

一、導包

Apache官網下載DBCP包,導入兩個包路徑如下:

commons-dbcp-1.4-bin\commons-dbcp-1.4\commons-dbcp-1.4.jar:連接池的實現

commons-pool-1.5.6-bin\commons-pool-1.5.6\commons-pool-1.5.6.jar:連接池實現的依賴庫 

CSDNjar包的下載地址:http://download.csdn.NET/detail/u012802702/9491642

二、代碼示例:

方式一:使用BasicDataSource 通過方法設置連接參數。

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. //獲取BasicDataSource並配置,開始....  
  2.         BasicDataSource source = new BasicDataSource();  
  3.     source.setDriverClassName("com.mysql.jdbc.Driver");  
  4.     source.setUrl("jdbc:mysql:///dbcptest");  
  5.     source.setUsername("root");  
  6.     source.setPassword("root");  
  7. //獲取BasicDataSource並配置,結束......  
  8.     try {  
  9.             conn = source.getConnection();  
  10.             ps = conn.prepareStatement("select * from account");  
  11.             rs = ps.executeQuery();  
  12.             while (rs.next()) {  
  13.                 String name = rs.getString("name");  
  14.                 System.out.println(name);  
  15.             }   
  16.      } catch (Exception e) {  
  17.             e.printStackTrace();  
  18.         } finally {  
  19.             if (rs != null) {  
  20.                 try {  
  21.                     rs.close();  
  22.                 } catch (SQLException e) {  
  23.                     e.printStackTrace();  
  24.                 } finally {  
  25.                     rs = null;  
  26.                 }  
  27.             }  
  28.             if (ps != null) {  
  29.                 try {  
  30.                     ps.close();  
  31.                 } catch (SQLException e) {  
  32.                     e.printStackTrace();  
  33.                 } finally {  
  34.                     ps = null;  
  35.                 }  
  36.             }  
  37.             if (conn != null) {  
  38.                 try {  
  39.                     conn.close();  
  40.                 } catch (SQLException e) {  
  41.                     e.printStackTrace();  
  42.                 } finally {  
  43.                     conn = null;  
  44.                 }  
  45.             }  
  46.         }  



 其中的Close方法是被改寫過得,及不會真正的將連接關閉,而是將其放回到連接池中,對於所有的數據源一般都會改寫此方法(使用修飾)。

方式二:使用BasicDataSourceFactory +配置文件

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. try {               //獲取並配置DataSource開始  
  2.         Properties prop = new Properties();  
  3.         prop.load(new FileReader("dbcp.properties"));  
  4.         BasicDataSourceFactory factory = new BasicDataSourceFactory();  
  5.         DataSource source = factory.createDataSource(prop);  
  6.     //獲取並配置DataSource,結束  
  7.         conn = source.getConnection();  
  8.         ps = conn.prepareStatement("select * from account");  
  9.         rs = ps.executeQuery();  
  10.         while (rs.next()) {  
  11.             String name = rs.getString("name");  
  12.             System.out.println(name);  
  13.         }  
  14.     } catch (Exception e) {  
  15.         e.printStackTrace();  
  16.     } finally {  
  17.         if (rs != null) {  
  18.             try {  
  19.                 rs.close();  
  20.             } catch (SQLException e) {  
  21.                 e.printStackTrace();  
  22.             } finally {  
  23.                 rs = null;  
  24.             }  
  25.         }  
  26.         if (ps != null) {  
  27.             try {  
  28.                 ps.close();  
  29.             } catch (SQLException e) {  
  30.                 e.printStackTrace();  
  31.             } finally {  
  32.                 ps = null;  
  33.             }  
  34.         }  
  35.         if (conn != null) {  
  36.             try {  
  37.                 conn.close();  
  38.             } catch (SQLException e) {  
  39.                 e.printStackTrace();  
  40.             } finally {  
  41.                 conn = null;  
  42.             }  
  43.         }  
  44.     }  




配置文件dbcp.properties(注配置文件中的參數的名稱固定): 

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. driver=com.mysql.jdbc.Driver  
  2. url=jdbc:mysql:///dbcptest  
  3. user=root  
  4. password=root  


另:配置文件中除了可以配置以上4數據庫連接的必須信息外,還可以配置其他的參數,官方較完整的配置文件的參考如下:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. #連接設置  
  2. driverClassName=com.mysql.jdbc.Driver  
  3. url=jdbc:mysql://localhost:3306/jdbc  
  4. username=root  
  5. password=  
  6.    
  7. #<!-- 初始化創建的連接數,當不夠時再去創建 -->  
  8. initialSize=10  
  9.    
  10. #最大連接數量,連接數連不能超過該值  
  11. maxActive=50  
  12.    
  13. #<!-- 最大空閒連接,當空閒連接超過該值時就挨個關閉多餘的連接,但不能小於minldle -->  
  14. maxIdle=20  
  15.    
  16. #<!-- 最小空閒連接,空閒連接的最下值 -->  
  17. minIdle=5  
  18.    
  19. #<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒,當連接超過該時間便認爲其實空閒連接 -->  
  20. maxWait=60000  
  21.    
  22.    
  23. #JDBC驅動建立連接時附帶的連接屬性屬性的格式必須爲這樣:[屬性名=property;]   
  24. #注意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裏不需要包含他們。  
  25. connectionProperties=useUnicode=true;characterEncoding=gbk  
  26.    
  27. #指定由連接池所創建的連接的自動提交(auto-commit)狀態。  
  28. defaultAutoCommit=true  
  29.    
  30. #driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。  
  31. #可用值爲下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE  
  32. defaultTransactionIsolation=READ_UNCOMMITTED  


C3P0

一、導包

下載C3p0數據源的jar包導入如下jar包:

Lib\c3p0-0.9.1.2.jar

CDSN的下載地址:http://download.csdn.Net/detail/u012802702/9491641

二、示例

方式一:使用代碼配置參數

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. try{  
  2.             ComboPooledDataSource source = new ComboPooledDataSource();  
  3.             source.setDriverClass("com.mysql.jdbc.Driver");  
  4.             source.setJdbcUrl("jdbc:mysql:///day11");  
  5.             source.setUser("root");  
  6.             source.setPassword("root");  
  7.               
  8.             conn = source.getConnection();  
  9.             ps = conn.prepareStatement("select * from account");  
  10.             rs = ps.executeQuery();  
  11.             while(rs.next()){  
  12.                 String name = rs.getString("name");  
  13.                 System.out.println(name);  
  14.             }  
  15.         }catch (Exception e) {  
  16.             e.printStackTrace();  
  17.         }finally{  
  18.             if(rs!=null){  
  19.                 try {  
  20.                     rs.close();  
  21.                 } catch (SQLException e) {  
  22.                     e.printStackTrace();  
  23.                 }finally{  
  24.                     rs = null;  
  25.                 }  
  26.             }  
  27.             if(ps!=null){  
  28.                 try {  
  29.                     ps.close();  
  30.                 } catch (SQLException e) {  
  31.                     e.printStackTrace();  
  32.                 }finally{  
  33.                     ps = null;  
  34.                 }  
  35.             }  
  36.             if(conn!=null){  
  37.                 try {  
  38.                     conn.close();  
  39.                 } catch (SQLException e) {  
  40.                     e.printStackTrace();  
  41.                 }finally{  
  42.                     conn = null;  
  43.                 }  
  44.             }  
  45.         }  
  46.     }  

方式二:配置文件的方式加載數據庫驅動信息 

C3p0的使用較爲簡單,通常來說只要在src目錄下添加一個c3p0的配置文件,在程序中使用一句代碼

1)ComboPooledDataSource source = new ComboPooledDataSource()使用配置文件中的默認配置<default-config>,或者

2)ComboPooledDataSource source = new ComboPooledDataSource(“配置文件中name-config的名稱”)使用配置文件中的其他配置

 

默認情況下C3p0會在類加載路徑下搜索名稱爲c3p0-config.xml的配置文件,因此該配置文件應該方式在類加載目錄、或者jar加載目錄、或者WEB-INF/classes、或類似目錄下。

c3p0-config.xml文件配置如下:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <c3p0-config>  
  3.   <default-config>  
  4.     <property name="driverClass">com.mysql.jdbc.Driver</property>  
  5.     <property name="jdbcUrl">jdbc:mysql:///c3p0test</property>  
  6.     <property name="user">root</property>  
  7.     <property name="password">root</property>  
  8.   </default-config>  
  9.   <named-config name="mysql2">   
  10.     <property name="driverClass">com.mysql.jdbc.Driver</property>  
  11.     <property name="jdbcUrl">jdbc:mysql:///c3p0test1</property>  
  12.     <property name="user">root</property>  
  13.     <property name="password">root</property>  
  14.   </named-config>  
  15. </c3p0-config>  
  16.       

當然在配置文件中可以配置數據庫連接池的其他相關信息,官方建議的基本配置參數有:

acquireIncrement:聲明當連接池中連接耗盡時再一次新生成多少個連接,默認爲3

initialPoolSize:當連接池啓動時,初始化連接的個數,必須在minPoolSize~maxPoolSize之間,默認爲3

minPoolSize:任何時間連接池中保存的最小連接數,默認3

maxPoolSize:在任何時間連接池中所能擁有的最大連接數,默認15

maxIdleTime:超過多長時間連接自動銷燬,默認爲0,即永遠不會自動銷燬

 

C03p0的官方參考模板如下:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <c3p0-config>  
  2.   <default-config>  
  3.     <property name="automaticTestTable">con_test</property>  
  4.     <property name="checkoutTimeout">30000</property>  
  5.     <property name="idleConnectionTestPeriod">30</property>  
  6. <property name="initialPoolSize">10</property>  
  7. 超過多長時間連接自動銷燬,默認爲0,即永遠不會自動銷燬  
  8.     <property name="maxIdleTime">30</property>  
  9.     <property name="maxPoolSize">100</property>  
  10.     <property name="minPoolSize">10</property>  
  11.     <property name="maxStatements">200</property>  
  12.   
  13.     <user-overrides user="test-user">  
  14.       <property name="maxPoolSize">10</property>  
  15.       <property name="minPoolSize">1</property>  
  16.       <property name="maxStatements">0</property>  
  17.     </user-overrides>  
  18.   
  19.   </default-config>  
  20.   
  21.   <!-- This app is massive! -->  
  22.   <named-config name="intergalactoApp">   
  23. 聲明當連接池中連接耗盡時再一次新生成多少個連接,默認爲3個  
  24. <property name="acquireIncrement">50</property>  
  25. 當連接池啓動時,初始化連接的個數,必須在minPoolSize~maxPoolSize之間,默認爲3  
  26. <property name="initialPoolSize">100</property>  
  27. 任何時間連接池中保存的最小連接數,默認3  
  28. <property name="minPoolSize">50</property>  
  29. 在任何時間連接池中所能擁有的最大連接數,默認15  
  30.     <property name="maxPoolSize">1000</property>  
  31.   
  32.     <!-- intergalactoApp adopts a different approach to configuring statement caching -->  
  33.     <property name="maxStatements">0</property>   
  34.     <property name="maxStatementsPerConnection">5</property>  
  35.   
  36.     <!-- he's important, but there's only one of him -->  
  37.     <user-overrides user="master-of-the-universe">   
  38.       <property name="acquireIncrement">1</property>  
  39.       <property name="initialPoolSize">1</property>  
  40.       <property name="minPoolSize">1</property>  
  41.       <property name="maxPoolSize">5</property>  
  42.       <property name="maxStatementsPerConnection">50</property>  
  43.     </user-overrides>  
  44.   </named-config>  
  45. </c3p0-config>  


Tomcat內置數據源(DBCP 

Tomcat中內置有數據源,而DBCPtomcat同屬於Apache的項目,因此不難知道tomcat中內置的數據源其實就是DBCP數據源。使用Tomcat的內置數據源可分爲兩步:

 

一:爲tomcat配置數據源

通常情況下,在使用eclipseMyeclipse開發時,自己習慣於使用如下方式爲tomcat配置數據源:

web應用的META-INF文件夾下創建一個context.xml配置文件,並在其中添加<Context>標籤進行配置,但,這種方式生成的數據源只能用於當前web應用.

詳細context.xml文件的參考代碼如下:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <Context>  
  3. <Resource name="jdbc/EmployeeDB" 當前創建數據連接池的名字,自己定義,在使用jndi容器獲取該數據源對象時會用到  
  4.             auth="Container" 作者  
  5.             type="javax.sql.DataSource" 對象類型這裏固定爲DataSource即可  
  6.             username="dbusername" 數據庫連接的用戶名  
  7.             password="dbpassword" 連接密碼  
  8.             driverClassName="com.mysql.jdbc.Driver" 驅動  
  9.             url="jdbc:mysql:///dbcptest" 數據庫的url  
  10.             maxActive="8"  DBCP的參數,DBCP的其他參數可以加入  
  11.             maxIdle="4"/>  
  12. </Context>  


tomcat啓動時,會逐個加載其中的web應用,當其加載到當前應用時,會加載到META-INF文件夾下該context.xml配置文件,此時tomcat會根據其中的配置信息爲當前web應用創建一個數據庫連接池,注該數據庫連接池只能用於當前web應用,tomcat下的其他web應用無法使用該數據庫連接池。至於如何配置tomcat的數據庫連接池才能使當前tomcat下的所有web應用都能使用,或者可以使當前虛擬主機下的web應用都能使用?請參考其他文章:http://blog.csdn.net/u012802702/article/details/51159547。 

二、程序中獲取數據源

tomcat讀取到context.xml配置文件時會爲當前web應用創建數據源,但我們在當前web應用中如何獲取該數據源對象?

Tomcat中有一個共有的容器:jndi,當Tomcatweb應用創建數據源之後會將數據源以鍵值對的形式存放到jndi容器當中,其中鍵名就是數據源配置時給定的名字(詳見context.xml配置文件)。

Tomcat會自動將jndi容器放到初始化容器InitalContext中。且jndi以固定的名字Java:comp/env)存儲在InitalContext容器中,因此在web應用中可以通過如下步驟首先獲取到數據源實例。

第一步:首先在Servlet中獲取InitalContext容器實例

Context initCtx = new InitialContext();

第二步:在InitalContext容器中根據字符串java:comp/env搜尋,以及獲取jndi容器實例

Context jndi = (Context) initCtx.lookup("java:comp/env");

第三部:根據數據源的名字從jndi容器獲取到數據源實例。

DataSource source = jndi.lookUp("mySource");

完整參考代碼如下:

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. Context initCtx = new InitialContext();  
  2. Context jndi = (Context) initCtx.lookup("java:comp/env");  
  3. DataSource source = jndi.lookUp("mySource");  

 

但到此獲取到數據源對象還沒有結束,因爲獲取jndi的代碼只能在Servlet中執行,即以上代碼只能在Servlet中執行,因此還應創建一個Servlet類並在其init方法中加入以上代碼,之後便可以將數據源對象傳給其他程序使用(可以將數據源對象設爲類變量、或將其放入到ServletContext作用域中等等)。同時將該Servlet配置成爲tomcat啓動時執行(即在web.xml配置文件中對應的該Servlet標籤下添加:<load-on-startup>1</load-on-startup>)。

參考代碼如下:

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. @Override  
  2.     public void init() throws ServletException {  
  3.         try{  
  4.             Context initCtx = new InitialContext();  
  5.             Context jndi = (Context) initCtx.lookup("java:comp/env");  
  6.             DataSource source = (DataSource) jndi.lookup("mySource");  
  7.             this.getServletContext().setAttribute(“dataSource”,source);  
  8.         }catch (Exception e) {  
  9.             e.printStackTrace();  
  10.             throw new RuntimeException(e);  
  11.         }  
  12.     }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章