当前位置:网站首页>自定义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自动化专题
- 测试工具专题
阅读原文,跳转我的仓库地址边栏推荐
- Msp430f5529 MCU reads gy-906 infrared temperature sensor
- Golang uses Mongo driver operation -- Query (array related)
- 2022年PMP项目管理考试敏捷知识点(3)
- MySQL character set
- ICML 2022: UFRGS |作为最优策略转移基础的乐观线性支持和后继特征
- Feign implements path escape through custom annotations
- 赛尔笔记|视频文本预训练简述
- Use of go log package log
- vivado VIO IP的用法
- Teach you how to transplant tinyriscv to FPGA
猜你喜欢

小程序referer

【PCL自学:Segmentation4】基于Min-Cut点云分割

flutter系列之:flutter中的变形金刚Transform

Zero foundation self-study SQL course | case function
![[digital ic/fpga] detect the position of the last matching sequence](/img/67/a1b575aa9b63892ed585d39e615c58.png)
[digital ic/fpga] detect the position of the last matching sequence

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)

vmware虚拟机桥接连通

【PCL自学:PCLVisualizer】点云可视化工具PCLVisualizer

halcon之区域:多种区域(Region)特征(6)

一文剖析C语言函数
随机推荐
ICML 2022: UFRGS |作为最优策略转移基础的乐观线性支持和后继特征
golang - new和make的区别
积分体系和营销活动结合在一起有哪些玩法
Vivado FFT IP的使用说明
C language - date formatting [easy to understand]
How to find Chinese documents corresponding to foreign documents?
【AI应用】NVIDIA Tesla V100-PCIE-32GB的详情参数
获取基因有效长度的N种方法
Are the registered accounts of the top ten securities companies safe and risky?
Eliminate gaps around El image images
Chenyun pytorch learning notes_ Build RESNET with 50 lines of code
Pat class B 1013
VMware virtual machine bridging connectivity
【PCL自学:Segmentation3】基于PCL的点云分割:区域增长分割
【AI应用】NVIDIA Tesla V100S-PCIE-32GB的详情参数
Zero foundation self-study SQL course | case function
刚开始看英文文献,想问一下各位,最初应该怎么看进去?
计数质数[枚举 -> 空间换时间]
Teach you how to transplant tinyriscv to FPGA
零基础自学SQL课程 | IF函数