JTA分布式事务接口响应慢
刺客围城 2016-12-21 02:11:11 项目使用的是struts2+spring+hibernate+jta ,java提供接口,PHP作为view层,项目整合后,发现接口响应时间都超过3S,mysql打开慢查询没有截取到任何sql超过1S的,测试了把数据源配置成JPA但数据源,同样的接口就基本上在1S内响应。问题定位在使用多数据源以后,接口的相应就变慢了,但是原因不知,望大神们不吝指教。
贴上JTA的数据源spring.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
.....">
<tx:annotation-driven />
<tx:jta-transaction-manager />
<!-- 通过注解方式自动扫描需交给sping管理的Bean -->
<context:component-scan base-package="com.xxx" />
<bean id="entityManagerFactory1"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="PersistenceUnit1" />
<property name="dataSource" ref="dataSource1" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="databasePlatform"
value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.service.jdbc.connections.spi.provider_class">com.jolbox.bonecp.provider.BoneCPConnectionProvider</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">none</prop> -->
</props>
</property>
</bean>
<bean id="entityManagerFactory2"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="PersistenceUnit2" />
<property name="dataSource" ref="dataSource2" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="databasePlatform"
value="org.hibernate.dialect.MySQL5InnoDBDialect" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.service.jdbc.connections.spi.provider_class">com.jolbox.bonecp.provider.BoneCPConnectionProvider</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">none</prop> -->
</props>
</property>
</bean>
<bean id="dataSource1" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="DataSource1" />
<property name="xaDataSource" ref="dataBase1" />
<property name="poolSize" value="3" />
</bean>
<bean id="dataBase1" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
lazy-init="true">
<property name="pinGlobalTxToPhysicalConnection" value="true" />
<property name="user" value="xxx" />
<property name="password" value="xxx" />
<property name="url" value="xxx" />
</bean>
<bean id="dataSource2" class="com.atomikos.jdbc.AtomikosDataSourceBean"
init-method="init" destroy-method="close">
<property name="uniqueResourceName" value="DataSource2" />
<property name="xaDataSource" ref="dataBase2" />
<property name="poolSize" value="3" />
</bean>
<bean id="dataBase2" class="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
lazy-init="true">
<property name="pinGlobalTxToPhysicalConnection" value="true" />
<property name="user" value="xxx" />
<property name="password" value="xxx" />
<property name="url" value="xxx" />
</bean>
<!-- <bean class="org.springframework.flex.core.io.JpaHibernateConfigProcessor"/> -->
<bean id="atomikosTransactionManager" class="com.atomikos.icatch.jta.UserTransactionManager"
init-method="init" destroy-method="close">
<property name="forceShutdown" value="false" />
</bean>
<bean id="atomikosUserTransaction" class="com.atomikos.icatch.jta.J2eeUserTransaction">
<property name="transactionTimeout" value="300" />
</bean>
<bean id="transactionManager"
class="org.springframework.transaction.jta.JtaTransactionManager"
depends-on="atomikosTransactionManager,atomikosUserTransaction">
<property name="transactionManager" ref="atomikosTransactionManager" />
<property name="userTransaction" ref="atomikosUserTransaction" />
<property name="allowCustomIsolationLevels" value="true" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allManagerMethod"
expression="execution(* com..service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
</aop:config>
<!-- 使用annotation定义事务,对于要加入事物的类,只需对该类加 @Transactional -->
<!-- <tx:annotation-driven transaction-manager="transactionManager" />
<tx:jta-transaction-manager /> -->
</beans>
persistence.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
...>
<persistence-unit name="PersistenceUnit1" transaction-type="JTA">
<class>com.xxx.core.user.domain.Company</class>
...
<properties>
<property name="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
<property name="hibernate.transaction.factory_class"
value="org.hibernate.transaction.CMTTransactionFactory" />
</properties>
</persistence-unit>
<persistence-unit name="PersistenceUnit2" transaction-type="JTA">
<class>com.xxx.core.car.domain.CarAirConditioningRefrigerator</class>
...
<properties>
<property name="hibernate.transaction.manager_lookup_class"
value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
<property name="hibernate.transaction.factory_class"
value="org.hibernate.transaction.CMTTransactionFactory" />
</properties>
</persistence-unit>
</persistence>
变成单数据源的spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
......">
<!-- 使用annotation @Repository,@Service自动注册bean, 并保证@Required、@Autowired的属性被注入的包范围 -->
<context:component-scan base-package="com.xxx" />
<!-- <bean id="propertyConfigurer" class="com.rd.p2p.common.util.des.DecryptPropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:desdb.properties</value>加密后文件
</list>
</property>
<property name="fileEncoding" value="utf-8"/>
<property name="keyLocation" value="classpath:desdb.key" />密钥文件位置
</bean> -->
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<!-- Connection Info coding -->
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
...
<property name="disableConnectionTracking" value="true" />
</bean>
<!-- Jpa Entity Manager 配置 -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
<property name="packagesToScan">
<list>
<value>com.xxx.core.*.domain</value>
</list>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.service.jdbc.connections.spi.provider_class">com.jolbox.bonecp.provider.BoneCPConnectionProvider</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<!-- <prop key="hibernate.hbm2ddl.auto">none</prop> -->
</props>
</property>
</bean>
<bean id="hibernateJpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
</bean>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="add*" propagation="REQUIRED" />
...
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="allManagerMethod"
expression="execution(* com..service.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod" />
</aop:config>
</beans>