作者:fbysss
msn:jameslastchina@hotmail.com
blog:blog.csdn.net/fbysss
声明:本文由fbysss原创,转载请注明出处
关键字:Atomikos数据连接池
前言
Atomikos数据连接池,国内有一些应用,但testQuery这个属性,在网上均是简单配置,并没有做特殊说明。通过对Atomikos源码的分析,发现这里很有学问。
分析
我们使用的数据源是AtomikosDataSourceBean,在其doInit方法中,会调用AtomikosXAConnectionFactory的createPooledConnection方法,该方法会返回一个AtomikosXAPooledConnection连接。
而AtomikosXAPooledConnection是AbstractXPooledConnection的一个子类,AbstractXPooledConnection中,在调用createConnectionProxy时,会调用testUnderlyingConnection方法,用于进行测试。
在AtomikosDataSourceBean的getConnection时,调用connectionPool的borrowConnection方法,从而调用AbstractXPooledConnection中的createConnectionProxy,从而调用testUnderlyingConnection方法。
可以看testUnderlyingConnection中的关键代码,一旦设置了testQuery,每次getConnection的时候,就会连接查询一次(通过jprofiler也可以检测出来):
如果失败,抛出CreateConnectionException异常。
注意ConnectionPool的borrowConnection方法,其中有一段:
可以看到,其做的事情,就是遍历连接池中的连接,一个一个的测试。注意ret = xpc.createConnectionProxy ( hmsg ),一旦该方法抛出CreateConnectionException,就执行it.remove();即将该连接从连接池中删除。
如果设置了testQuery属性,每次获取连接时testQuery,能够保证应用服务器启动之后,与数据库连接暂时中断之后,能够在下一次请求时,自动重新建立连接。
连接池是如何自动建立连接的呢?其实就是简单的把无效的连接一个一个删掉,直到全部删光了,池里面没有有效(poolAvailableSize==0,是根据连接的isTerminated状态来判断的,而不是是否被重置过)的连接了,这样根据连接池的机制,就会调用growPool方法去请求新的连接。
但是这样有性能消耗,而且还不小。对于网站展示部分,不需要实时去检测,可以考虑采用定时检测的方法:
n 首先,保证testQuery为空,不配置。
n 创建一个DbPoolMonitorService类,实现ApplicationContextAware接口,这样应用启动时,会自动注入ApplicationContext对象。这样,可以在service中,调用getBean方法,获取AtomikosDataSourceBean的实例,
AtomikosDataSourceBean ads = (AtomikosDataSourceBean)ctx.getBean(“jtaDataSource”);
然后,ads中能够获得minPoolSize/maxPoolSize/availablePoolSize/totalPoolSize等属性,可以做一个界面来监测数据连接池的使用和配置情况,甚至可以动态修改这些属性。
n 做一个定时器,调用一个DbPoolMonitorService定期去手工test。使用SELECT 1 语句即可。
n 注意:try 部分ads.setTestQuery (“SELECT 1”);然后调用BaseDao的实例去执行一句话,依然可以使”SELECT 1” 。finally部分ads.setTestQuery(null),以保证不对其他部分造成后续影响。
n 可根据用户访问量,来决定定时周期,一般10分钟左右即可。这样,避免了每次获取连接去做一次检测操作,又能够将故障限制在一定时间范围内。是一个较好的折衷做法。
补充:我们再看ret = xpc.createConnectionProxy ( hmsg )这句话,如果这时候DB和WebAppServer的网络链路已经正常,DB正常运行,返回将不是空,会退出循环。这样,如果连接池中的连接是多个,则只会生成1个新的连接,如果要保证连接池机制的效果,需要在写监控程序的时候,去取得所有有效连接,循环test。
分享到:
相关推荐
atomikos数据源包spring中配置数据源的相关资源jar包
本用例基于 Spring Boot + Druid + Mybatis 配置多数据源,并采用 JTA 实现分布式事务。
SpringBoot+Atomikos分布式事务及多数据源动态切换,两种demo,两条数据源,是满足事务唯一性的,看清楚是demo
基于XA的非Maven 基于SpringMVC+Spring+MyBatis+Atomikos的分布式事务处理案例源码,亲自测试可以使用。能SSM多数据源环境和分布式环境下事务处理问题.
spring 3.2+ hibernate 3.* +atomikos3.9 配置多数据源 包含所有jar包和源代码,完整项目
springboot-atomikos 多数据源统一事物管理demo!!!!
使用springboot+jta+atomikos来配置多数据源下的事务分布管理 里面带有sql语句.直接下载下来,并且运行sql就可以测试运行
SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式 SpringBoot+Atomikos+动态多数据源+事务+2种切换数据源的方式
spring 3.2+ jpa 1.1+ atomikos3.9 配置mysql+sqlserver2000多数据源 包含所需所有jar包,完整项目
springboot + mybatis + atomikos 多数据源分布式事物管理;springboot + mybatis + atomikos 多数据源分布式事物管理
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
spring+hibernate+atomikos实现多数据源分布式事务管理
springboot+mybatis+druid+atomikos 多数据源,分布式事务,集成websocket,redis,swagger2
Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源,分别向两个不同的数据里面插入数据同时失败和成功,调用接口方式原理一样。
Atomikos,是一个基于Java的开源事务管理器,提供了事务管理和连接池,不需要应用服务器支持,支持JDBC和JMS事务,能提供对Spring,Hibernate的集成,有兴趣多了解的可以直接参考说明文当,有详细的介绍和使用说明。
Spring Boot:mybatis-plus + atomikos + druid 实现不同实例数据库的多数据源配置和分布式事务管理(demo项目),想到工作上可能会用到多数据源,但是自己在这方面并不是很熟悉,于是在网上查阅了很多文章,结果...
多数据源事务可采用jta+atomikos方式来解决事务问题。
1.利用mina框架重构api,脱离了web应用服务器resin,而原api的jta事务由resin支持,故需要用其他支持jta事务的...2.Api的数据库连接配置参数没有类似:testQuery的参数,导致隔段时间后首次连接数据库失去数据库连接
使用spring + atomikos+druid配置的分布式事务demo,两种数据源配置方式都可以,使用junit测试没问题,案例中使用的mysql数据库是8.0.11版本,版本不同请自行修改pom.xml和jdbc.properties
atomikos的jar包,我这里也发表了一份Spring3.2+mybatis3.0+atomikos的jta系统搭建的博客,喜欢的朋友也可以支持一下。