目录引言可池化对象池化工厂对象池API封装引言最近在学习了通用池化框架commons-pool2实践之后,再HTTP性能测试中进行了实践,结果出乎意料,对于性能提升没啥卵用。经过我自己的本地测试,性能...
目录
引言可池化对象
池化工厂
对象池
API封装
引言
最近在学习了通用池化框架commons-pool2实践之后,再HTTP性能测试中进行了实践,结果出乎意料,对于性能提升没啥卵用。经过我自己的本地测试,性能也是足够好的。
后来我仔细想了想,原来是我用错地方了。本来想自己写一个Redis的连接池的没想到,jedis的连接池本身就是commons-pool2开发的,让我有点意外,看来想的是一样的。commons-pool2用来做连接池是非常不错的。
我仔细找了找,发现还缺一个本地的mysql连接池,而不是springboot那样需要启动一个服务才行。当然应该也是有的,不过我非常想自己写一个然后进行各类测试,所以也没有仔细找。
可池化对象
首先,我们需要一个可池化对象,这里我选用了com.funtester.db.mysql.FunMySql,这是一个我自己写的单链接的MySQL对象。我计划用这个作为基础可池化对象。
packagecom.funtester.db.mysql;
importcom.funtester.base.interfaces.IMySqlBasic;
importcom.funtester.config.SqlConstant;
importJava.sql.Connection;
importjava.sql.ResultSet;
importjava.sql.Statement;
/**
*mysql操作的基础类
*<p>用于存储数据,多用于爬虫</p>
*/
publicclassFunMySqlextendsSqlBaseimplementsIMySqlBasic{
/**
*{@linkSqlConstant#FUN_SQL_URL}会替换IP到URL
*/
Stringurl;
/**
*库
*/
Stringdatabase;
/**
*用户
*/
Stringuser;
/**
*密码
*/
Stringpassword;
Connectionconnection;
Statementstatement;
/**
*私有构造方法
*
*@paramurl连接地址,包括端口
*@paramdatabase库
*@paramuser用户名
*@parampassword密码
*/
publicFunMySql(Stringurl,Stringdatabase,Stringuser,Stringpassword){
this.url=url;
this.database=database;
this.user=user;
this.password=password;
getConnection(database);
}
/**
*初始化连接
*/
@Override
publicvoidgetConnection(){
getConnection(EMPTY);
}
/**
*执行sql语句,非query语句,并不关闭连接
*
*@paramsql
*/
@Override
publicvoidexecuteUpdateSql(Stringsql){
SqlBase.executeUpdateSql(connection,statement,sql);
}
/**
*查询功能
*
*@paramsql
*@return
*/
@Override
publicResultSetexecuteQuerySql(Stringsql){
returnSqlBase.executeQuerySql(connection,statement,sql);
}
/**
*关闭query连接
*/
@Override
publicvoidover(){
SqlBase.close(connection,statement);
}
@Override
publicvoidgetConnection(Stringdatabase){
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.FunMySql的时候,顺便一起初始化MySQL连接。然后再com.funtester.db.mysql.MysqlPool.FunTester#destroyObject的时候进行连接的回收。
/**
*池化工厂类
*/
privateclassFunTesterextendsBasePooledObjectFactory<FunMySql>{
@Override
FunMySqlcreate()throwsException{
returnnewFunMySql(url,database,user,password)
}
@Override
PooledObject<FunMySql>wrap(FunMySqlobj){
returnnewDefaultPooledObject<FunMySql>(obj)
}
@Override
voiddestroyObject(PooledObject<FunMySql>p)throwsException{
p.getObject().over()
super.destroyObject(p)
}
}
对象池
这里显得有些冗余,后面再使用过程中,我会继续优化。通过创建一个com.funtester.db.mysql.MysqlPool对象,获取一个com.funtester.db.mysql.FunMySql对象池。
/**js
*自定义MySQL连接池对象
*/
classMysqlPoolextendsPoolConstant{
privatestaticfinalLoggerlogger=LogManager.getLogger(MysqlPool.class);
/**
*{@linkcom.funtester.config.SqlConstant#FUN_SQL_URL}会替换IP到URL*/
Stringurl;
/**
*库
**/
Stringdatabase;
/**
*用户
**/
Stringuser;
/**
*密码
**/
Stringpassword;
privateGenericObjectPool<FunMySql>pool
MysqlPool(Stringurl,Stringdatabase,Stringuser,Stringpassword){
this.url=url
this.database=database
this.user=user
this.password=password
init()
}
/**
*初始化连接池
*@return
*/
definit(){
GenericObjectPoolConfigpoolConfig=newGenericObjectPoolConfig();
poolConfig.setMaxTotal(MAX);
poolConfig.setMinIdle(MIN_IDLE);
poolConfig.setMaxIdle(MAX_IDLE);
poolConfig.setMaxWaitMillis(MAX_WAIT_TIME);
poolConfig.setMinEvictableIdleTimeMillis(MAX_IDLE_TIME);
pool=newGenericObjectPool<FunMySql>(newFunTester(),poolConfig);
}
}
API封装
自从学习了Go语言的gorm框架和Redis框架,我发现其实不用把池化相关信息不用暴露出来,直接封装原始的API,暴露给用户使用,这样用户就不用关心连接的回收问题了。
/**
*借出对象
*@return
*/
defborrow(){
try{
retujsrnpool.borrowObject()
}catch(e){
logger.warn("获取${jsONObject.class}失败",e)
}finally{
newJSONObject()
}
}
/**
*归还对象
*@paramfunMySql
*@return
*/
defback(FunMySqlfunMySql){
pool.returnObject(funMySql)
}
/**
*执行updateSQL
*@paramsql
*@return
*/
defexecute(defsql){
defdriver=borrow()
try{
driver.executeUpdateSql(sql)
}catch(e){
logger.warn("执行:{}失败",sql)
}finally{
back(driver)
}
}
/**
*执行查询SQL
*@paramsql
*@return
*/
defquery(defsql){
defdriver=borrow()
try{
returndriver.executeQuerySql(sql)
}catch(e){
logger.warn("执行:{}失败",sql)
}finally{
back(driver)javascript
}
}
以上就是MySQL连接池自定义示例详解的详细内容,更多关于MySQL连接池自定义的资料请关注我们其它相关文章!










