連接池原理 連接池原理 資料庫連接池的基本思想就是為資料庫連接建立一個“緩衝池”。預先在緩衝池中放入一定數量的連接,當需要建立資料庫連接時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。我們可以通過設定連接池最大連接數來防止系統無盡的與資料庫連接。 現在流行的第三方Java資料庫連接池庫 DBC ...
-
連接池原理
資料庫連接池的基本思想就是為資料庫連接建立一個“緩衝池”。預先在緩衝池中放入一定數量的連接,當需要建立資料庫連接時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。我們可以通過設定連接池最大連接數來防止系統無盡的與資料庫連接。
現在流行的第三方Java資料庫連接池庫
-
DBCP
它是Apache推出的Database Connection Pool,屬於Apache Commons開源項目,官網:http://commons.apache.org/components.html。Commons的目的是提供可重用的、開源的Java代碼。
使用步驟:
> 1 添加jar包 commons-dbcp-1.4.jar commons-pool-1.5.6.jar
>2 添加屬性資源文件,命名:dbcp.properties,文件放在src目錄下
#連接設置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/database username= password= #<!-- 初始化連接 --> initialSize=10 #最大連接數量 maxActive=50 #<!-- 最大空閑連接 --> maxIdle=20 #<!-- 最小空閑連接 --> minIdle=5 #<!-- 超時等待時間以毫秒為單位 6000毫秒/1000等於60秒 --> maxWait=60000 #JDBC驅動建立連接時附帶的連接屬性屬性的格式必須為這樣:[屬性名=property;] #註意:"user" 與 "password" 兩個屬性會被明確地傳遞,因此這裡不需要包含他們。 connectionProperties=useUnicode=true;characterEncoding=utf8 #指定由連接池所創建的連接的自動提交(auto-commit)狀態。 defaultAutoCommit=true #driver default 指定由連接池所創建的連接的只讀(read-only)狀態。 #如果沒有設置該值,則“setReadOnly”方法將不被調用。(某些驅動並不支持只讀模式,如:Informix) defaultReadOnly= #driver default 指定由連接池所創建的連接的事務級別(TransactionIsolation)。 #可用值為下列之一:(詳情可見javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=REPEATABLE_READ
> 3 編寫數據源工具類
public class DBCPUtil { //得到數據源 private static DataSource dataSource; static{ try { Properties pro = new Properties(); pro.load(DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties")); //得到連接池對象,同時獲取配置文件中的信息給連接池對象使用 dataSource = BasicDataSourceFactory.createDataSource(pro); } catch (Exception e) { throw new ExceptionInInitializerError("連接池初始化失敗"); } } //獲取Connection對象的方法 public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } //釋放資源,這裡的conn.close()是將連接對象放回連接池中,並不是銷毀 public static void release(Connection conn){ if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
} } }
-
C3P0
它是一個開源的JDBC連接池,它實現了數據源和JNDI綁定,支持JDBC3規範和JDBC2的標準擴展。目前使用它的開源項目有Hibernate,Spring等。
c3p0與dbcp區別:dbcp沒有自動回收空閑連接的功能,c3p0有自動回收空閑連接功能。使用步驟:
1、添加jar包 c3p0-0.9.1.2.jar,下載位置:http://www.oschina.net/p/c3p0,開源中國中有詳細的下載地址。
2、編寫配置文件 c3p0-config.xml,文件名固定,不能更改,【C3P0百度百科】有詳細配置信息,比較全。
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config>
<!-- 嚴格使用駝峰命名法,如果不是,將會出錯,例如JdbcUrl就會出錯。 --> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property> <property name="user"></property> <property name="password"></property> <!--最大空閑時間,60秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0 --> <property name="maxIdleTime">60</property> <!--每60秒檢查所有連接池中的空閑連接。Default: 0 --> <property name="idleConnectionTestPeriod">60</property> <!--兩次連接中間隔時間,單位毫秒。Default: 1000 --> <property name="acquireRetryDelay">1000</property> <!--初始化時獲取10個連接,取值應在minPoolSize與maxPoolSize之間。Default: 3 --> <property name="initialPoolSize">0</property> <!--最大空閑時間,30秒內未使用則連接被丟棄。若為0則永不丟棄。Default: 0 --> <property name="maxIdleTime">30</property> <!--連接池中保留的最大連接數。Default: 15 --> <property name="maxPoolSize">2</property> <property name="minPoolSize">0</property> <property name="maxStatements">200</property> <user-overrides user="test-user"> <property name="maxPoolSize">10</property> <property name="minPoolSize">1</property> <property name="maxStatements">0</property> </user-overrides> </default-config> </c3p0-config>
3、編寫工具類
public class C3P0Util { private static ComboPooledDataSource cpds = new ComboPooledDataSource(); private static int i=1; public static ComboPooledDataSource getCpds() { return cpds; } public static Connection getConnection(){ Connection conn=null; try { conn=cpds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return conn; } public static void close(Connection ct){ if(ct!=null){ try { ct.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
-
Tomcat內置連接池
開發JavaWeb應用,必須使用一個JavaWeb伺服器,JavaWeb伺服器都內置數據源。
數據源只需要配置伺服器即可。
配置數據源的步驟:
1、拷貝【資料庫連接的jar】到tomcat的lib目錄下
2、配置數據源XML文件
a)如果把配置信息寫在tomcat下的conf目錄的context.xml中,那麼所有應用都能使用此數據源。
b)如果是在當前應用的META-INF中創建context.xml, 編寫數據源,那麼只有當前應用可以使用。
<Resource name="jdbc/test" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="10" maxWait="-1" username="" password="" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://127.0.0.1:3306/test"/>
3、使用連接池
Context initContext = new InitialContext(); DataSource ds = (DataSource)initContext.lookup("java:comp/env/jdbc/test"); Connection conn = ds.getConnection();
-
JNDI:java nameing directory interface
JNDI容器就是一個Map
key(String) |
value(Object) |
path+name |
對象 |
path+"jdbc/day16" |
DataSource對象 |