当前位置:网站首页>自定义MySQL连接池
自定义MySQL连接池
2022-06-27 21:33:00 【InfoQ】
commons-pool2jediscommons-pool2commons-pool2可池化对象
com.funtester.db.mysql.FunMySqlpackage com.funtester.db.mysql;
import com.funtester.base.interfaces.IMySqlBasic;
import com.funtester.config.SqlConstant;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* mysql操作的基础类
* <p>用于存储数据,多用于爬虫</p>
*/
public class FunMySql extends SqlBase implements IMySqlBasic {
/**
* {@link SqlConstant#FUN_SQL_URL}会替换IP到URL
*/
String url;
/**
* 库
*/
String database;
/**
* 用户
*/
String user;
/**
* 密码
*/
String password;
Connection connection;
Statement statement;
/**
* 私有构造方法
*
* @param url 连接地址,包括端口
* @param database 库
* @param user 用户名
* @param password 密码
*/
public FunMySql(String url, String database, String user, String password) {
this.url = url;
this.database = database;
this.user = user;
this.password = password;
getConnection(database);
}
/**
* 初始化连接
*/
@Override
public void getConnection() {
getConnection(EMPTY);
}
/**
* 执行sql语句,非query语句,并不关闭连接
*
* @param sql
*/
@Override
public void executeUpdateSql(String sql) {
SqlBase.executeUpdateSql(connection, statement, sql);
}
/**
* 查询功能
*
* @param sql
* @return
*/
@Override
public ResultSet executeQuerySql(String sql) {
return SqlBase.executeQuerySql(connection, statement, sql);
}
/**
* 关闭query连接
*/
@Override
public void over() {
SqlBase.close(connection, statement);
}
@Override
public void getConnection(String database) {
if (connection == null)
connection = SqlBase.getConnection(SqlConstant.FUN_SQL_URL.replace("ip", url).replace("database", database), user, password);
if (statement == null) statement = SqlBase.getStatement(connection);
}
}
池化工厂
com.funtester.db.mysql.FunMySqlcom.funtester.db.mysql.MysqlPool.FunTester#destroyObject /**
* 池化工厂类
*/
private class FunTester extends BasePooledObjectFactory<FunMySql> {
@Override
FunMySql create() throws Exception {
return new FunMySql(url, database, user, password)
}
@Override
PooledObject<FunMySql> wrap(FunMySql obj) {
return new DefaultPooledObject<FunMySql>(obj)
}
@Override
void destroyObject(PooledObject<FunMySql> p) throws Exception {
p.getObject().over()
super.destroyObject(p)
}
}
对象池
com.funtester.db.mysql.MysqlPoolcom.funtester.db.mysql.FunMySql/**
* 自定义MySQL连接池对象
*/
class MysqlPool extends PoolConstant {
private static final Logger logger = LogManager.getLogger(MysqlPool.class);
/**
* {@link com.funtester.config.SqlConstant#FUN_SQL_URL}会替换IP到URL*/
String url;
/**
* 库
**/
String database;
/**
* 用户
**/
String user;
/**
* 密码
**/
String password;
private GenericObjectPool<FunMySql> pool
MysqlPool(String url, String database, String user, String password) {
this.url = url
this.database = database
this.user = user
this.password = password
init()
}
/**
* 初始化连接池
* @return
*/
def init() {
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
poolConfig.setMaxTotal(MAX);
poolConfig.setMinIdle(MIN_IDLE);
poolConfig.setMaxIdle(MAX_IDLE);
poolConfig.setMaxWaitMillis(MAX_WAIT_TIME);
poolConfig.setMinEvictableIdleTimeMillis(MAX_IDLE_TIME);
pool = new GenericObjectPool<FunMySql>(new FunTester(), poolConfig);
}
}
API封装
/**
* 借出对象
* @return
*/
def borrow() {
try {
return pool.borrowObject()
} catch (e) {
logger.warn("获取${JSONObject.class} 失败", e)
} finally {
new JSONObject()
}
}
/**
* 归还对象
* @param funMySql
* @return
*/
def back(FunMySql funMySql) {
pool.returnObject(funMySql)
}
/**
* 执行update SQL
* @param sql
* @return
*/
def execute(def sql) {
def driver = borrow()
try {
driver.executeUpdateSql(sql)
} catch (e) {
logger.warn("执行:{}失败", sql)
} finally {
back(driver)
}
}
/**
* 执行查询SQL
* @param sql
* @return
*/
def query(def sql) {
def driver = borrow()
try {
return driver.executeQuerySql(sql)
} catch (e) {
logger.warn("执行:{}失败", sql)
} finally {
back(driver)
}
}
- 性能测试专题
- Java、Groovy、Go、Python
- 单测&白盒
- FunTester社群风采
- 测试理论鸡汤
- 接口功能测试专题
- FunTester视频专题
- 案例分享:方案、BUG、爬虫
- UI自动化专题
- 测试工具专题
阅读原文,跳转我的仓库地址边栏推荐
- Course strategy sharing plan of Zhejiang University
- 【AI应用】Jetson Xavier NX的详情参数
- The file or assembly 'cefsharp.core.runtime.dll' or one of its dependencies could not be loaded. Is not a valid Win32 Application. (exception from hresult:0x800700c1)
- [PCL self study: Segmentation3] PCL based point cloud segmentation: region growth segmentation
- Windows环境下的ELK——Logstash+Mysql(4)
- Excel print settings public header
- 企业架构师面试的100个问题
- 零基础自学SQL课程 | SQL基本函数大全
- Safe, fuel-efficient and environment-friendly camel AGM start stop battery is full of charm
- 第 2 章 集成 MP
猜你喜欢
![[PCL self study: pclvisualizer] point cloud visualization tool pclvisualizer](/img/38/c7ce908bfcc5cc5cd5856996aa015b.png)
[PCL self study: pclvisualizer] point cloud visualization tool pclvisualizer

Stream + Nacos

webService
![[tinyriscv verilator] branch transplanted to Da Vinci development board of punctual atom](/img/a8/4786e82d0646b08c195dd0a17af227.png)
[tinyriscv verilator] branch transplanted to Da Vinci development board of punctual atom

发射,接收天线方向图

An analysis of C language functions

【微服务|Sentinel】sentinel数据持久化

Applet referer

安全省油环保 骆驼AGM启停电池魅力十足

【PCL自学:PCLVisualizer】点云可视化工具PCLVisualizer
随机推荐
c语言字符指针、字符串初始化问题
小程序referer
Golang - the difference between new and make
Swing UI——容器(一)
vivado 如何添加时序约束
Grab those duplicate genes
用两个栈实现队列[两次先进后出便是先进先出]
赛尔笔记|视频文本预训练简述
Sell notes | brief introduction to video text pre training
Build an open source and beautiful database monitoring system -lepus
刚开始看英文文献,想问一下各位,最初应该怎么看进去?
How to use raspberry pie (and all kinds of pies)
2022年PMP项目管理考试敏捷知识点(3)
2022 PMP project management examination agile knowledge points (3)
【AI应用】NVIDIA GeForce RTX 1080Ti的详情参数
如何找到外文文献对应的中文文献?
Elk in Windows Environment - logstash+mysql (4)
【Try to Hack】veil-evasion免杀
搭建开源美观的数据库监控系统-Lepus
安全省油环保 骆驼AGM启停电池魅力十足