我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

引言

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

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

目录引言可池化对象池化工厂对象池API封装引言最近在学习了通用池化框架commons-pool2实践之后,再HTTP性能测试中进行了实践,结果出乎意料,对于性能提升没啥卵用。经过我自己的本地测试,性能也是足够好的。后来我仔细想了想,原来
2022-07-21

开发自定义Mysql连接池

使用第三方包    https://pypi.python.org/pypi/DBUtils      tar -zxvf *.tar.gz * python3 setup.py build && python3 setup.py inst
2023-01-31

编程热搜

目录