生活随笔
收集整理的這篇文章主要介紹了
JDBC(11)—数据库连接池
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在實(shí)際開發(fā)過(guò)程中,特別是在web應(yīng)用系統(tǒng)中,如果程序直接訪問(wèn)數(shù)據(jù)庫(kù)中的數(shù)據(jù),每一次數(shù)據(jù)訪問(wèn)請(qǐng)求丟必須經(jīng)歷建立數(shù)據(jù)庫(kù)連接、打開數(shù)據(jù)庫(kù)、存取數(shù)據(jù)和關(guān)閉數(shù)據(jù)庫(kù)連接。而連接并打開數(shù)據(jù)庫(kù)是一件既消費(fèi)資源又費(fèi)時(shí)的工作,如果頻繁發(fā)生這種操作,系統(tǒng)的性能必然會(huì)急劇下降,甚至?xí)?dǎo)致系統(tǒng)崩潰。數(shù)據(jù)庫(kù)連接池技術(shù)就是解決這個(gè)問(wèn)題的常用方法。基本思想:
- 為數(shù)據(jù)庫(kù)連接建立一個(gè)“緩沖池”,預(yù)先在緩沖池中放入一定量的連接,當(dāng)需要建立數(shù)據(jù)庫(kù)連接時(shí),只需從緩沖池中取出一個(gè),使用
*完畢之后再放回去。
數(shù)據(jù)庫(kù)連接池負(fù)責(zé):
- 分配、管理、釋放連接,它允許應(yīng)用程序重復(fù)使用一個(gè)現(xiàn)有的鏈接,而不是重新建立一個(gè)。
- 4.最大最小連接數(shù)
- 數(shù)據(jù)庫(kù)連接池在初始化時(shí)將創(chuàng)建一定數(shù)量的數(shù)據(jù)庫(kù)鏈接放到連接池中,這些數(shù)據(jù)庫(kù)連接數(shù)量由最小數(shù)據(jù)庫(kù)連接數(shù)來(lái)設(shè)定無(wú)論這些;連接
*是否被使用,連接池都將保證至少擁有這么多的連接數(shù),連接池的最大數(shù)據(jù)庫(kù)連接數(shù)限定了這個(gè)連接池能占有的最大連接數(shù),當(dāng)應(yīng)用程序
*向連接池請(qǐng)求的連接超過(guò)最大連接數(shù)時(shí)這些請(qǐng)求就被加入到等待隊(duì)列中。
優(yōu)點(diǎn):
- ——資源重用
- ——更快的系統(tǒng)反應(yīng)速度
- ——新的資源分配手段
- ——統(tǒng)一的資源管理,避免數(shù)據(jù)庫(kù)連接的泄露
兩種開源的數(shù)據(jù)庫(kù)連接池
- JDBC數(shù)據(jù)庫(kù)連接池使用javax.sql.DataSource來(lái)表示,DataSource只是一個(gè)接口,該接口通常由服務(wù)器
*(Weblogic、WebSphere、Tomcat)提供實(shí)現(xiàn),也有一些開源組織提供實(shí)現(xiàn) - ——DBCP數(shù)據(jù)庫(kù)連接池
- ——C3P0數(shù)據(jù)庫(kù)連接池
DataSource通常被稱為數(shù)據(jù)源,它包含連接池和連接池管理管理部分,通常習(xí)慣上把DataSource稱為連接池
實(shí)例:
jar包:commons-dbcp2-2.1.1.jar、c3p0-0.9.5.2.jar
配置文件
/*** 10.使用數(shù)據(jù)庫(kù)連接池創(chuàng)建連接*一個(gè)連接池只需要?jiǎ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實(shí)例* ③DataSource中獲取數(shù)據(jù)庫(kù)連接* @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(
"等待時(shí)間:"+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實(shí)例* DataSource dataSource = new ComboPooledDataSource("helloC3P0");* 3.從dataSource中獲取連接*/@Testpublic void testC3P0WithConfigFile()
throws SQLException{DataSource dataSource =
new ComboPooledDataSource(
"helloC3P0");System.out.println(dataSource.getConnection());}
/*** 測(cè)試TestTools工具類中使用連接池創(chuàng)建連接*/@Testpublic void testConnectionWithTestTools(){Connection conn = TestTools.getConnectionWithC3P0();System.out.println(conn);TestTools.release(
null, conn);}}
轉(zhuǎn)載于:https://www.cnblogs.com/tengpengfei/p/10454011.html
總結(jié)
以上是生活随笔為你收集整理的JDBC(11)—数据库连接池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。