以前认为连接池,线程池这些东西很高端。因为出了问题之后,总是有人说这个连接池/线程线的配置不对嘛,应该..... 今天学习了下,这个池到底应该怎么设计。发现apache的common-pool早就思考过这个问题了,并且定义了一个规范和框架。基于此我学习了些资料来写一个数据库连接池。

先写个测试程序,多线程不停的拿连接与释放连接,取到连接就打印一下连接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自定义资源池相关推荐

  1. common pool2 mysql_连接池Commons Pool2的使用

    客户端这边,如果每次都临时建立一个新的连接,那么连接的开销非常大. 业内常用的连接池组件是 Commons Pool2---版本 2.4.2 packageservice.pool; importor ...

  2. 面试官问:对象池技术了解吗?apache common pool2呢?

    欢迎关注方志朋的博客,回复"666"获面试宝典 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是 ...

  3. 自己写的grpc简单连接池,基于common pool2

    17年的时候写的证券的项目,当时交易端是另外一批同事开发的,他们强烈要求用grpc,当时这个东西还不那么成熟,在网上也搜索不到比较完美的第三方的连接池搭配使用,索性就自己写了一个,因为之前thrift ...

  4. common.php下载,插件common.php全局函数文件

    系统内置函数 建议先熟悉系统内置 application/common.php 与 application/function.php 两文件的函数说明,如果有符合的函数,尽量在插件里调用:不符合的话就 ...

  5. linux docker 中使用 System.Drawing.Common 异常 System.Drawing.Common 仅在 Windows 上受支持

    System.Drawing.Common NuGet 包现在被归类为特定于 Windows 的库.为非 Windows 操作系统编译时,平台分析器会在编译时发出警告. 在非 Windows 操作系统 ...

  6. poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)

    LCA思想:http://www.cnblogs.com/hujunzheng/p/3945885.html 在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好 ...

  7. Dapper.Common基于Dapper的开源LINQ超轻量扩展

    Dapper.Common Dapper.Common是基于Dapper的LINQ实现,支持.net core,遵循Linq语法规则.链式调用.配置简单.上手快,支持Mysql,Sqlserver(目 ...

  8. 【C#】【Log】Common.Logging.MultipleLogger及ETWLoggerd研究

    common.logging是基于java语言的一个日志门面框架,是Apache基金会下的commons项目下的一个子项目,让你的日志脱离具体的实现. Commong.Logging是.NET下的日志 ...

  9. selenium.common.exceptions.SessionNotCreatedException

    selenium.common.exceptions.SessionNotCreatedException selenium.common.exceptions.SessionNotCreatedEx ...

最新文章

  1. 3690状态压缩+暴力
  2. 取消Ajax请求 || Ajax重复请求问题
  3. Django2.+ path配置
  4. JVM从入门到精通(一):JVM入门级class文件格式
  5. 华为云GaussDB(for openGauss)推出重磅内核新特性
  6. 错误记录(四)java.lang.IllegalArgumentException: Control character in cookie value or attribute.
  7. Arch Linux 服务器,Arch Linux不适合当作服务器操作系统的四大原因
  8. 个人计算机的缩写英语,计算机的缩写. 计算机中常见的英语缩写是什么?
  9. 使用Docker+Grafana+InfluxDB可视化展示Jenkins构建信息
  10. 简单解释什么是 依赖注入 和 控制反转 1
  11. Android Studio 基础知识
  12. win10录屏_关于使用Win10自带录屏工具小技巧
  13. OPPO对诺基亚发起5G专利侵权诉讼
  14. 计算机安全模式无法启动,电脑安全模式启动不了怎么办
  15. android打包报错Detected multiple Kotlin daemon sessions
  16. python模块cpca修改源码支持国外地址解析
  17. localhost和127.0.0.1都无法打开的解决方法
  18. 如何将pdf等非标准数据文件转换成可供EXCEL等软件分析的数据
  19. Java //PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星
  20. DD-WRT 的优点

热门文章

  1. sdn专线架构是怎样的?如何工作?——Vecloud
  2. C++11带来的全新数值和字符串转换函数
  3. SSH客户端字符集编码设置
  4. 视频监控/存储系统设计要点
  5. P1875 佳佳的魔法药水 (最短路,DP)
  6. (二)Linux命令使用
  7. bootstrap 引用注意事项
  8. iPhone开发环境搭建For PC
  9. 《C#高级编程》既不高级,也不基础,东拼西凑的味道十足。。。
  10. 湖北省政府网站刊文:感染新冠肺炎的适龄男性应进行生育力检查