common pool2 mysql_用common-pool自定义资源池
以前认为连接池,线程池这些东西很高端。因为出了问题之后,总是有人说这个连接池/线程线的配置不对嘛,应该..... 今天学习了下,这个池到底应该怎么设计。发现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自定义资源池相关推荐
- common pool2 mysql_连接池Commons Pool2的使用
客户端这边,如果每次都临时建立一个新的连接,那么连接的开销非常大. 业内常用的连接池组件是 Commons Pool2---版本 2.4.2 packageservice.pool; importor ...
- 面试官问:对象池技术了解吗?apache common pool2呢?
欢迎关注方志朋的博客,回复"666"获面试宝典 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是 ...
- 自己写的grpc简单连接池,基于common pool2
17年的时候写的证券的项目,当时交易端是另外一批同事开发的,他们强烈要求用grpc,当时这个东西还不那么成熟,在网上也搜索不到比较完美的第三方的连接池搭配使用,索性就自己写了一个,因为之前thrift ...
- common.php下载,插件common.php全局函数文件
系统内置函数 建议先熟悉系统内置 application/common.php 与 application/function.php 两文件的函数说明,如果有符合的函数,尽量在插件里调用:不符合的话就 ...
- linux docker 中使用 System.Drawing.Common 异常 System.Drawing.Common 仅在 Windows 上受支持
System.Drawing.Common NuGet 包现在被归类为特定于 Windows 的库.为非 Windows 操作系统编译时,平台分析器会在编译时发出警告. 在非 Windows 操作系统 ...
- poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)
LCA思想:http://www.cnblogs.com/hujunzheng/p/3945885.html 在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好 ...
- Dapper.Common基于Dapper的开源LINQ超轻量扩展
Dapper.Common Dapper.Common是基于Dapper的LINQ实现,支持.net core,遵循Linq语法规则.链式调用.配置简单.上手快,支持Mysql,Sqlserver(目 ...
- 【C#】【Log】Common.Logging.MultipleLogger及ETWLoggerd研究
common.logging是基于java语言的一个日志门面框架,是Apache基金会下的commons项目下的一个子项目,让你的日志脱离具体的实现. Commong.Logging是.NET下的日志 ...
- selenium.common.exceptions.SessionNotCreatedException
selenium.common.exceptions.SessionNotCreatedException selenium.common.exceptions.SessionNotCreatedEx ...
最新文章
- 3690状态压缩+暴力
- 取消Ajax请求 || Ajax重复请求问题
- Django2.+ path配置
- JVM从入门到精通(一):JVM入门级class文件格式
- 华为云GaussDB(for openGauss)推出重磅内核新特性
- 错误记录(四)java.lang.IllegalArgumentException: Control character in cookie value or attribute.
- Arch Linux 服务器,Arch Linux不适合当作服务器操作系统的四大原因
- 个人计算机的缩写英语,计算机的缩写. 计算机中常见的英语缩写是什么?
- 使用Docker+Grafana+InfluxDB可视化展示Jenkins构建信息
- 简单解释什么是 依赖注入 和 控制反转 1
- Android Studio 基础知识
- win10录屏_关于使用Win10自带录屏工具小技巧
- OPPO对诺基亚发起5G专利侵权诉讼
- 计算机安全模式无法启动,电脑安全模式启动不了怎么办
- android打包报错Detected multiple Kotlin daemon sessions
- python模块cpca修改源码支持国外地址解析
- localhost和127.0.0.1都无法打开的解决方法
- 如何将pdf等非标准数据文件转换成可供EXCEL等软件分析的数据
- Java //PP2.16编写一个applet,画出北斗七星,并在夜空中添加一些其他的星星
- DD-WRT 的优点