日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

common pool2 mysql_用common-pool自定义资源池

發(fā)布時(shí)間:2025/4/16 数据库 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 common pool2 mysql_用common-pool自定义资源池 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

以前認(rèn)為連接池,線程池這些東西很高端。因?yàn)槌隽藛栴}之后,總是有人說(shuō)這個(gè)連接池/線程線的配置不對(duì)嘛,應(yīng)該..... 今天學(xué)習(xí)了下,這個(gè)池到底應(yīng)該怎么設(shè)計(jì)。發(fā)現(xiàn)apache的common-pool早就思考過這個(gè)問題了,并且定義了一個(gè)規(guī)范和框架。基于此我學(xué)習(xí)了些資料來(lái)寫一個(gè)數(shù)據(jù)庫(kù)連接池。

先寫個(gè)測(cè)試程序,多線程不停的拿連接與釋放連接,取到連接就打印一下連接id。如果同一個(gè)id,出現(xiàn)多次,則證明這個(gè)連接被復(fù)用了。

1.測(cè)試程序

public class TestJDBCPool {

public static void main(String[] args) {

//初始化,實(shí)際可用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.設(shè)計(jì)JDBCPool

根據(jù)common-pool的定義,我們要定義兩個(gè)類,一個(gè)是Pool類給應(yīng)用提供"取對(duì)象"與"還對(duì)象"兩個(gè)方法。另一個(gè)是PooledObjectFactory類,用于生產(chǎn)對(duì)象與包裝對(duì)象。

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 -- 默認(rèn)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;

}

//創(chuàng)建對(duì)象

@Override

public Connection create() throws Exception {

return DriverManager.getConnection(url, userName, passwd);

}

//包裝對(duì)象

@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

總結(jié)

以上是生活随笔為你收集整理的common pool2 mysql_用common-pool自定义资源池的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。