數據庫連接池概念
我們都知道,在我們對數據庫操作時,頻繁打開關閉數據庫資源,是一件十分耗時,耗資源的事情,數據庫的打開與關閉會消耗很多的系統資源,因此,對程序的性能會有很大的影響。針對這個問題,提出了數據庫連接池的概念,來有效的解決這個問題。數據庫連接池其實就是對數據庫連接資源(Connection)的管理,數據庫連接池默認會主動創建一定數量的Connection對象,當有用戶需要獲取Connection對象時,數據庫連接池將池內空閒的對象提供給用戶操作,用戶操作完成後調用Connection對象的close操作,此操作並不是將Connection對象銷燬,關閉數據庫連接,而是將Connection對象返還到數據庫連接池,供下次其他用戶請求,這樣將連接對象持久化,就很好的解決了頻繁打開關閉數據庫資源的操作。
數據庫連接池池參數
- 初始大小:連接池默認生成多少個連接對象
- 最小空閒連接數:當池中空閒連接數小於等於該值時,連接池對根據增量創建對應的連接對象
- 增量:一次性創建連接對象的最小單位
- 最大空閒連接數:當池中空閒連接數大於等於該值時,數據庫自動銷燬部分連接對象,直到空閒連接對象等於該值。
- 最大連接個數:連接池創建連接對象,最多池中的連接對象總值不得超過該值
- 最大等待時間:當池中沒有空閒連接對象,且不得再創建連接對象時,用戶再申請資源時的合理等待時間,超過該時間,拋出異常。
DBCP
dbcp是apache的common組件提供的數據庫連接池(commons-dbcp-版本號.jar,此處用的是commons-dbcp-1.4.jar),這個jar包需要依賴commons-pools-版本號.jar,dbcp內部使用的是裝飾者模式。
連接池必須實現javax.sql.DataSource接口!
- 使用dbcp獲取Connection對象
dbcp中的連接池對象爲BasicDataSource
/*
* 1.創建連接池對象
* 2.配置四大參數
* 3.配置池參數
* 4.得到連接對象
*/
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setMaxActive(10);//設置最大活動連接數
dataSource.setMaxIdle(5); //設置最大空閒連接
dataSource.setMaxWait(1000);//設置最大等待時間,單位毫秒
Connection conn = dataSource.getConnection();
C3P0
C3P0是開源免費的數據庫連接池,相對於DBCP,C3P0效率更高,更安全,運用更廣泛被很多人看好。他需要依賴c3p0-0.9.2-pre1.jar與mchange-commons-0.2.jar,如果數據庫使用的是Oracle,還需要依賴c3p0-oracle-thin-extras-0.9.2-pre1.jar
C3P0獲取連接對象
C3P0中的連接池對象爲ComboPooledDataSource
- 無配置文件方法
/*
* 1.創建連接池對象
* 2.配置四大參數
* 3.設置池配置
* 4.獲取Connection對象
*/
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setAcquireIncrement(5);
dataSource.setInitialPoolSize(10);
dataSource.setMaxPoolSize(20);
Connection conn = dataSource.getConnection();
System.out.println(conn.getClass().getName());
conn.close();
- 配置文件-默認
配置文件要求:
1.文件名必須是c3p0-config.xml
2.文件位置必須在src目錄下
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="InitialPoolSize">10</property>
<property name="MAXPoolSize">20</property>
</default-config>
</c3p0-config>
代碼:
ComboPooledDataSource dataSource = new ComboPooledDataSource();
Connection conn = dataSource.getConnection();
System.out.println(conn.getClass().getName());
conn.close();
- 配置文件-指定名字
c3p0-config.xml:
<named-config name="mysql-config">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="acquireIncrement">5</property>
<property name="InitialPoolSize">10</property>
<property name="MAXPoolSize">20</property>
</named-config>
Java代碼:
ComboPooledDataSource dataSource = new ComboPooledDataSource("mysql-config");
Connection conn = dataSource.getConnection();
System.out.println(conn.getClass().getName());
conn.close();