使用spring的代理datasource来让spring管理事务,性能问题解决,提高8倍
<bean id="dataSourceProxy"class="org.springframework.jdbc.datasource.TransactionAwareDataSour
ceProxy">
<constructor-argref="dataSource"></constructor-arg>
</bean>
1. Atomikos从池里取得connection时,每次都会去进行select test,这个对获取连接的影响很大,取消这个测试,TPS大概能提高近1倍;
2. Atomilos对池中connection的管理效率随着连接数的上升,呈现指数级的下降,测试环境中,连接最大配置为300,但实际上最大值没有超过70,线程dump发现连接池管理对象上存在激烈的锁竞争,导致很多线程等待前面的线程释放锁对象;
3. 由于Atomikos支持JTA事务,而c3p0则不支持,这导致atomikos在获取connection时,首先需要从线程上下文去检索是否已经存在着connection,这个检测从atomikos的实现上看,会遍历连接池中所有connection对象,所以当连接数上升时,连接池的效率显著下降;
当前采用的措施以及实施建议:
1. 生产环境中一般最大连接数控制在100,而我们测试中则是配上了300,与真实环境不一致,从而放大了两者的差距;
2. 对atomikos的连接池代码进行了部分优化,一是将空闲的连接总是放在池的最前面,加快获取连接的速度,二是对空闲连接数用计数器管理,而不用去遍历所有的连接状态得到这个值;
3. 在将两者都将最大值设为100后,对比测试,发现,atomikos与c3p0还有一倍的TPS差距,在网关的测试中一台tomcat可以达到144的TPS;目前在生产环境是4台OC4J,实际峰值TPS大概是15,应该说,目前atomikos的性能是完全能满足现在和将来一段时间的时间需求的;