生活随笔
收集整理的這篇文章主要介紹了
JDBC(11)—数据库连接池
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在實際開發(fā)過程中,特別是在web應用系統(tǒng)中,如果程序直接訪問數(shù)據(jù)庫中的數(shù)據(jù),每一次數(shù)據(jù)訪問請求丟必須經(jīng)歷建立數(shù)據(jù)庫連接、打開數(shù)據(jù)庫、存取數(shù)據(jù)和關閉數(shù)據(jù)庫連接。而連接并打開數(shù)據(jù)庫是一件既消費資源又費時的工作,如果頻繁發(fā)生這種操作,系統(tǒng)的性能必然會急劇下降,甚至會導致系統(tǒng)崩潰。數(shù)據(jù)庫連接池技術就是解決這個問題的常用方法。基本思想:
- 為數(shù)據(jù)庫連接建立一個“緩沖池”,預先在緩沖池中放入一定量的連接,當需要建立數(shù)據(jù)庫連接時,只需從緩沖池中取出一個,使用
*完畢之后再放回去。
數(shù)據(jù)庫連接池負責:
- 分配、管理、釋放連接,它允許應用程序重復使用一個現(xiàn)有的鏈接,而不是重新建立一個。
- 4.最大最小連接數(shù)
- 數(shù)據(jù)庫連接池在初始化時將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫鏈接放到連接池中,這些數(shù)據(jù)庫連接數(shù)量由最小數(shù)據(jù)庫連接數(shù)來設定無論這些;連接
*是否被使用,連接池都將保證至少擁有這么多的連接數(shù),連接池的最大數(shù)據(jù)庫連接數(shù)限定了這個連接池能占有的最大連接數(shù),當應用程序
*向連接池請求的連接超過最大連接數(shù)時這些請求就被加入到等待隊列中。
優(yōu)點:
- ——資源重用
- ——更快的系統(tǒng)反應速度
- ——新的資源分配手段
- ——統(tǒng)一的資源管理,避免數(shù)據(jù)庫連接的泄露
兩種開源的數(shù)據(jù)庫連接池
- JDBC數(shù)據(jù)庫連接池使用javax.sql.DataSource來表示,DataSource只是一個接口,該接口通常由服務器
*(Weblogic、WebSphere、Tomcat)提供實現(xiàn),也有一些開源組織提供實現(xiàn) - ——DBCP數(shù)據(jù)庫連接池
- ——C3P0數(shù)據(jù)庫連接池
DataSource通常被稱為數(shù)據(jù)源,它包含連接池和連接池管理管理部分,通常習慣上把DataSource稱為連接池
實例:
jar包:commons-dbcp2-2.1.1.jar、c3p0-0.9.5.2.jar
配置文件
/*** 10.使用數(shù)據(jù)庫連接池創(chuàng)建連接*一個連接池只需要創(chuàng)建一次就行,所以連接池的代碼需要使用static */private static DataSource dataSource=
null;
static {dataSource =
new ComboPooledDataSource(
"helloC3P0");}
public static Connection
getConnectionWithC3P0(){
try {
return dataSource.getConnection();}
catch (SQLException e) {e.printStackTrace();}
return null;}
文件名:c3p0-config.xml
<c3p0-config> <named-config name="helloC3P0"> <property name="user">root
</property><property name="password"></property><property name="jdbcUrl">jdbc:mysql:///test
</property><property name="driverClass">com.mysql.jdbc.Driver
</property><property name="initialPoolSize">5
</property> <property name="acquireIncrement">5
</property> <property name="minPoolSize">5
</property> <property name="maxPoolSize">100
</property> <property name="maxStatements">10
</property> <property name="maxStatementsPerConnection">5
</property></named-config>
</c3p0-config>
public class ConnectionPool {/*** 1.使用DBCP連接池* @throws SQLException * dbcp包依賴pool包*/@Testpublic void testDBCP()
throws SQLException{
final BasicDataSource dataSource =
new BasicDataSource();System.out.println(dataSource);dataSource.setUsername(
"root");dataSource.setPassword(
"");dataSource.setUrl(
"jdbc:mysql:///test");dataSource.setDriverClassName(
"com.mysql.jdbc.Driver");dataSource.setInitialSize(
5);dataSource.setMaxTotal(
5);dataSource.setMinIdle(
2);dataSource.setMaxWaitMillis(
1000 *
5);Connection conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());Connection connection = dataSource.getConnection();System.out.println(
"》"+conn.getClass());
new Thread(){
public void run(){Connection conn =
null;
try {conn = dataSource.getConnection();System.out.println(conn.getClass());}
catch (SQLException e) {e.printStackTrace();}};}.start();
try {Thread.sleep(
3000);}
catch (InterruptedException e) {e.printStackTrace();}connection.close();}
/*** 2.修改以上方法,使用配置文件創(chuàng)建連接池* 步驟:* ①加載dbcp的配置文件* ②調(diào)用BasicDataSourceFactory的createDataSource方法創(chuàng)建DataSource實例* ③DataSource中獲取數(shù)據(jù)庫連接* @throws IOException */@Testpublic void testDBCPWithDataSourceFactory()
throws Exception{Properties properties =
new Properties();InputStream inStream = ConnectionPool.class.getClassLoader().getResourceAsStream(
"dbcp.properties");properties.load(inStream);DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);System.out.println(dataSource);BasicDataSource basicDataSource = (BasicDataSource)dataSource;System.out.println(
"等待時間:"+basicDataSource.getMaxWaitMillis());Connection conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());conn = dataSource.getConnection();System.out.println(
"》"+conn.getClass());conn = dataSource.getConnection();System.out.println(conn.getClass());}
/*** 3.使用C3P0連接池* @throws PropertyVetoException * @throws SQLException * */@Testpublic void testC3P0()
throws Exception{ComboPooledDataSource cpds =
new ComboPooledDataSource(); cpds.setDriverClass(
"com.mysql.jdbc.Driver" ); cpds.setJdbcUrl(
"jdbc:mysql:///test" ); cpds.setUser(
"root"); cpds.setPassword(
"");System.out.println(cpds.getConnection());}
/*** 4.修改,以上方法,使用配置文件的形式,創(chuàng)建連接池* @throws SQLException * 步驟:* 1.創(chuàng)建c3p0-config.xml配置文件* 2.創(chuàng)建CombPooledDataSource實例* DataSource dataSource = new ComboPooledDataSource("helloC3P0");* 3.從dataSource中獲取連接*/@Testpublic void testC3P0WithConfigFile()
throws SQLException{DataSource dataSource =
new ComboPooledDataSource(
"helloC3P0");System.out.println(dataSource.getConnection());}
/*** 測試TestTools工具類中使用連接池創(chuàng)建連接*/@Testpublic void testConnectionWithTestTools(){Connection conn = TestTools.getConnectionWithC3P0();System.out.println(conn);TestTools.release(
null, conn);}}
轉載于:https://www.cnblogs.com/tengpengfei/p/10454011.html
總結
以上是生活随笔為你收集整理的JDBC(11)—数据库连接池的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。