三種數據庫鏈接池的配置

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

 
 

鏈接池的優缺點html

 

優勢java

 

使用鏈接池的最主要的優勢是性能。建立一個新的數據庫鏈接所耗費的時間主要取決於網絡的速mysql

度以及應用程序和數據庫服務器的web

(sql

網絡數據庫

)tomcat

距離,並且這個過程一般是一個很耗時的過程。而採用服務器

數據庫鏈接池後,數據庫鏈接請求能夠直接經過鏈接池知足而不須要爲該請求從新鏈接、認證到網絡

數據庫服務器,這樣就節省了時間。app

 

缺點

 

數據庫鏈接池中可能存在着多個沒有被使用的鏈接一直鏈接着數據庫

(

這意味着資源的浪費

)

DBCP

1、導包

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:鏈接池實現的依賴庫 

CSDN上jar包的下載地址:http://download.csdn.net/detail/u012802702/9491642

2、代碼示例:

方式一:使用BasicDataSource 經過方法設置鏈接參數。

 

[java]  view plain  copy
 
  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
 
  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
 
  1. driver=com.mysql.jdbc.Driver  
  2. url=jdbc:mysql:///dbcptest  
  3. user=root  
  4. password=root  



 

另:配置文件中除了能夠配置以上4個數據庫鏈接的必須信息外,還能夠配置其餘的參數,官方較完整的配置文件的參考以下:

 

[html]  view plain  copy
 
  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

1、導包

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

Lib\c3p0-0.9.1.2.jar

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

2、示例

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

 

[java]  view plain  copy
 
  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
 
  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
 
  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中內置有數據源,而DBCP與tomcat同屬於Apache的項目,所以不難知道tomcat中內置的數據源其實就是DBCP數據源。使用Tomcat的內置數據源可分爲兩步:

 

一:爲tomcat配置數據源

一般狀況下,在使用eclipse或Myeclipse開發時,本身習慣於使用以下方式爲tomcat配置數據源:

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

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

 

[html]  view plain  copy
 
  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。 

2、程序中獲取數據源

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

Tomcat中有一個共有的容器:jndi,當Tomcat爲web應用建立數據源以後會將數據源以鍵值對的形式存放到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
 
  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
 
  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.     }  
相關文章
相關標籤/搜索