common pool2 mysql_用common-pool自定义资源池
以前認為連接池,線程池這些東西很高端。因為出了問題之后,總是有人說這個連接池/線程線的配置不對嘛,應該..... 今天學習了下,這個池到底應該怎么設計。發現apache的common-pool早就思考過這個問題了,并且定義了一個規范和框架?;诖宋覍W習了些資料來寫一個數據庫連接池。
先寫個測試程序,多線程不停的拿連接與釋放連接,取到連接就打印一下連接id。如果同一個id,出現多次,則證明這個連接被復用了。
1.測試程序
public class TestJDBCPool {
public static void main(String[] args) {
//初始化,實際可用spring初始化
JDBCPool pool=new JDBCPool("jdbc:mysql://localhost:3306/test","root","xx","com.mysql.jdbc.Driver",null);
try {
for (int i = 0; i < 200; i++) {
new Thread(new PoolTestThread(pool)).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private static class PoolTestThread implements Runnable {
private JDBCPool pool;
public PoolTestThread(JDBCPool pool) {
this.pool=pool;
}
public void run() {
try {
Connection conn = pool.getConnection();
System.out.println(Thread.currentThread().getName() + " : " + conn.hashCode());
Thread.sleep(1000);
//歸還連接
JDBCPool.returnConnection(conn);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
2.設計JDBCPool
根據common-pool的定義,我們要定義兩個類,一個是Pool類給應用提供"取對象"與"還對象"兩個方法。另一個是PooledObjectFactory類,用于生產對象與包裝對象。
package net.highersoft.pool;
import java.sql.Connection;
import java.sql.DriverManager;
import org.apache.commons.pool2.BasePooledObjectFactory;
import org.apache.commons.pool2.PooledObject;
import org.apache.commons.pool2.impl.DefaultPooledObject;
import org.apache.commons.pool2.impl.GenericObjectPool;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
public class JDBCPool {
private volatile static JDBCPool pool;
private static GenericObjectPool connPool;
/**
* 初始化連接池,傳遞所需資源
* @param url
* @param userName
* @param passwd
* @param driver
* @param config
*/
public JDBCPool(String url,String userName,String passwd,String driver,GenericObjectPoolConfig config) {
if (config == null) {
config = getDefaultConfig();
}
connPool = new GenericObjectPool(new JDBCPooledFactory(url,userName,passwd,driver), config);
}
private GenericObjectPoolConfig getDefaultConfig() {
GenericObjectPoolConfig conf = new GenericObjectPoolConfig();
// TODO -- 默認8,8,0
conf.setMaxTotal(50);
conf.setMaxIdle(50);
conf.setMinIdle(0);
conf.setMaxWaitMillis(60000);
return conf;
}
/**
* 得到連接
* @return
* @throws Exception
*/
public Connection getConnection() throws Exception {
return connPool.borrowObject();
}
/**
* 釋放連接
* @param conn
*/
public static void returnConnection(Connection conn) {
connPool.returnObject(conn);
}
static class JDBCPooledFactory extends BasePooledObjectFactory {
private String url;
private String userName;
private String passwd;
public JDBCPooledFactory(String url,String userName,String passwd,String driver) {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
this.url=url;
this.userName=userName;
this.passwd=passwd;
}
//創建對象
@Override
public Connection create() throws Exception {
return DriverManager.getConnection(url, userName, passwd);
}
//包裝對象
@Override
public PooledObject wrap(Connection conn) {
return new DefaultPooledObject(conn);
}
}
}
再看一下maven依賴:
org.apache.commons
commons-pool2
2.4.2
mysql
mysql-connector-java
5.0.5
總結
以上是生活随笔為你收集整理的common pool2 mysql_用common-pool自定义资源池的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python中怎么创建配置文件_在Pyt
- 下一篇: web和mysql连接并增删改查_Jav