文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MySQL池化框架学习接池自定义

2022-07-21 13:00

关注

引言

最近在学习了通用池化框架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;

publicclassFunMySqlextendsSqlBaseimplementsIMySqlBasic{

Stringurl;

Stringdatabase;

Stringuser;

Stringpassword;
Connectionconnection;
Statementstatement;

publicFunMySql(Stringurl,Stringdatabase,Stringuser,Stringpassword){
this.url=url;
this.database=database;
this.user=user;
this.password=password;
getConnection(database);
}

@Override
publicvoidgetConnection(){
getConnection(EMPTY);
}

@Override
publicvoidexecuteUpdateSql(Stringsql){
SqlBase.executeUpdateSql(connection,statement,sql);
}

@Override
publicResultSetexecuteQuerySql(Stringsql){
returnSqlBase.executeQuerySql(connection,statement,sql);
}

@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对象池。


classMysqlPoolextendsPoolConstant{
privatestaticfinalLoggerlogger=LogManager.getLogger(MysqlPool.class);

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()
}

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,暴露给用户使用,这样用户就不用关心连接的回收问题了。


defborrow(){
try{
returnpool.borrowObject()
}catch(e){
logger.warn("获取${jsONObject.class}失败",e)
}finally{
newJSONObject()
}
}

defback(FunMySqlfunMySql){
pool.returnObject(funMySql)
}

defexecute(defsql){
defdriver=borrow()
try{
driver.executeUpdateSql(sql)
}catch(e){
logger.warn("执行:{}失败",sql)
}finally{
back(driver)
}
}

defquery(defsql){
defdriver=borrow()
try{
returndriver.executeQuerySql(sql)
}catch(e){
logger.warn("执行:{}失败",sql)
}finally{
back(driver)
}
}

以上就是MySQL连接池自定义示例详解的详细内容,更多关于MySQL连接池自定义的资料请关注我们其它相关文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯