随着业务的不断扩展数据库的压力越来越大,为了减少数据库的压力我们要从多方面考虑分析,并提出多个解决数据库压力大的问题,比如说根据业务分表、分库、增加缓存机制等等。如果是分库,如何做分布式呢?我就做分布式的库来讨论一下如何使用jta事务。
什么是jta网上有很多很详细的解释,我不在这里介绍。为了开发效率现在的传统行业的大部分中小企业还是采用SSH架构,那我们就从SSH+JTA的架构说一下如何使用jta。
使用JTA一般的需要容器的支持,如何摆脱容器的绑定呢?目前网上有两个开源的软件:Atomikos和JTOM。两个都是非常优秀的JTA两阶段提交事务的实现。查看JTOM的官网发现其最近的更新时间是2005年,并且spring3的已经放弃了对JTOM的集成。Atomikos的最近更新时间是2010年,并不是说他们的更新时间越晚越好好,实际上他们两个对事务的支持已经相当稳定。
下面我们就Atomikos来说明一下如何配置SSH+JTA。
首先下载Atomikos http://www.atomikos.com/
我下载的版本是:AtomiosTransactionEssentials-3.8.0
Spring 3.0.4
Hibernate 3.5.5
Struts 2
配置数据源
使用JTA要使用XA的数据源,流程的数据库都提供了XA的数据源的实现,比如我们使用mysql数据源,mysql的XA数据源:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
DB2的XA数据源:com.ibm.db2.jcc.DB2XADataSource
我们需要在Spring的xml配置文件配置数据的多个数据源如下所示
<!—mysql数据源---> <bean id=”mysqlDataSource” class=”com.atomikos.jdbc.AtommikosDataSourceBean” init-method=”init” destroy-method=”close”> <property name=”uniqueResourceName”> <value> mysqlDataSource </value> </property> <property name=”xaDataSourceClassName”> <value> com.mysql.jdbc.jdbc2.optional.MysqlXADataSource </value> </property> <property name=”xa properties”> <props> <prop key=”URL”>jdbc:mysql://192.168.1.45:3306/dbname?userUnicode=true&characterEncoding=utf-8&autoReconnect=true</prop> <prop key=”user”>root</prop> <prop key=”password”>root</prop> <prop key=”pinGlobalTxToPhysicalConnetion”>true</prop> </props> </property> </bean> <!—DB2数据源---> <bean id=”db2DataSource” class=”com.atomikos.jdbc.AtommikosDataSourceBean” init-method=”init” destroy-method=”close”> <property name=”uniqueResourceName”> <value> db2DataSource </value> </property> <property name=”xaDataSourceClassName”> <value> com.ibm.db2.jcc.DB2XADataSource </value> </property> <property name=”xa properties”> <props> <prop key=”serverName”> 192.168.1.45 </prop> <prop key=”portNumber”>50000 </prop> <prop key=”databseName”>dbname</prop> <prop key=”user”>root</prop> <prop key=”password”>root</prop> <prop key=”driverType”>4</prop> </props> </property> </bean> 对应的sessionFactory配置(Hibernate的): <bean id=”mysqlSessionFactory” class=“org.springframework.org.hibernate3.annotation.AnnotationSessionFactoryBean”> <!---采用注解扫描实体--> <property name=”packagesToScan” value=”com.zohan”/> <property name=”dataSource” ref=”mysqlDataSource”/> <property name=”jtaTransactionManager” ref=”atomikosTransactionManager”/> <!---hibernate 实体对应配置文件---> <property name=”mapppingResources”> <list> <value>xxx.xml</value> </list> </property> <!—hibernate 配置属性,可以参考Hibernate帮助文档这里只罗列和jta相关的配置--> <property name=”hibernateProperties”> <props> <prop key=”hibernate.current_session_context_class”>jta</prop> <prop key=”hibernate.transaction.factory_class”> Com.atomikos.icatch.jta.hibernate3.AtomikosJTATransactionFactory </prop> <prop key=”hibernate.transcation.manager_lookup_class”> com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup </prop> <prop key=”hibernate.connection.release_mode”>after_statement</prop> </props> </property> </bean> Db2的session配置基本上和mysql的相同知识数据源的引用,这里就不列出了,下面我们进行jta的配置 <bean id=”atomikosTransactionManager” class=”com.atomikos.icatch.jta.UserTransactionManager” init-method=”init” destroy-method=”close”> <property name=”forceShutdown”><value>true</value></property> </bean> <bean id=”atomikosUserTransaction” class=”com.atomikos.icatch.jta.UserTransactionImp”> <property name=”transactionTimeout” value=”240”/> </bean> <bean id=”transactionManager” class=“org.springframework.transaction.jta.JtaTransactionManager”> <property name=”transactionManager” ref=”atomikosTransactionManager”/> <property name=”userTransaction” ref=”atomikosUserTransaction”/> <property name=”allowCustomIsolationLevels” value=”true” /> </bean> <!----> <aop:aspect-autoproxy proxy-target-class=”true”/> <!—扫描jar包中注解bean--> <context:component-scan base-package=”com.zohan.base”/> <!—事务的切入点配置---> <aop:config proxy-target-calss=”true”> <aop:advisor pointcut=”execution(* com.zohan..*ServiceImpl.*(..))” advice-ref=”txAdvice”/> </aop:config> <tx:annotation-driven proxy-target-class=”true” transaction-manager=”transactionManager”/> <tx:advice id=”txAdvice” transaction-manager=” transactionManager”> <tx:attributes> <tx:method name=”save*” /> <tx:method name=”get*” read-only=”true” /> </tx:attributes> </ tx:advice>
在dao层使用sessionFactory, 为实现dao层的读写分离,把dao层分离出读和写的方法抽象成不同的接口和实现类,分别注入不同的sessionFactory。
如何在dao层使用自定义的sessionFactory?这样的场景一般是特定的业务需要特定的数据库,可能是一是一个service层调用不同的dao方法。那这样的我们可以在dao层实现不同的数据库操作,一般的实现方式是在dao层注入sessionFactory,dao实现类继承HibernateDaoSupport,并实现initDao方法,在initDao方法使用使用setSessionFactory方法实现HibernateDaoSupport的sessionFactory的设置。
配置OpenSessionInViewFilter,在web.xml中针对每个sessionFactory配置OpenSessionInViewFilter。
总结:在传统业务中如果单纯的为了减少数据的压力而采读写分离,而采用分布式事务管理其实是不合适的。采用分布式事务管理因采用两阶段提交,增加了响应时间,无形的增加了应用的压力,因此鄙人认为这并不是一个好的减少数据库压力的解决方案。我们可以从其他方式来解决数据库的压力,比如缓存。
相关推荐
-- JTA环境的事务配置 <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager or WebLogicJtaTransactionManager"/> --> <!-- 使用annotation定义事务 --> ...
第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。 第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再有...
DWR3.0 Spring3.2 Hibernate4.2 JPA全注解实例。采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。.
第9章:介绍了Spring事务管理的工作机制,通过XML、注解等方式进行事务管理配置,同时还讲解了JTA事务配置知识。 第10章:对实际应用中Spring事务管理各种疑难问题进行透彻的剖析,让读者对Spring事务管理不再...
Wicket6.7 Spring3.2 Hibernate4.2 EJB全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。
Spring3.2 Hibernate4.2 JPA2全注解实例.采用JTA事务管理,配置ehcache为二级缓存,在glassfish3.2.2和postgresql9测试通过。参考网上的资料整理。
在Spring3中配置声明式事务比早期版本显得更加简便。只需要几行配置文件+注解就可以实现面向切面的AOP事务
6.jta-1.1.jar(hibernate对事务的处理) 7.slf4j-api-1.6.4.jar(一个日志系统的服务的api) 8.slf4j-nop-1.6.4.jar(对slf4j-api-x.x.x.jar的一个实现) 9.ojdbc14.jar (oracle驱动) 10.mysql-connector-java-...
Java Transaction API (JTA)、JDBC、Hibernate 和 Java Persistence API (JPA) 等事务 API,实现了一致的编程模型,而 Spring 的声明式事务功能更是提供了极其方便的事务配置方式,配合 Spring Boot 的自动配置,...
5.4在spring里集成hibernate 5.4.1选择hibernate的版本 5.4.2使用hibernate模板 5.4.3建立基于hibernate的dao 5.4.4使用hibernate3上下文会话 5.5spring和java持久api 5.5.1使用jpa模板 5.5.2创建一个实体...
5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建...
5.4 在Spring里集成Hibernate 5.4.1 选择Hibernate的版本 5.4.2 使用Hibernate模板 5.4.3 建立基于Hibernate的DAO 5.4.4 使用Hibernate 3上下文会话 5.5 Spring和Java持久API 5.5.1 使用JPA模板 5.5.2 创建...
6.jta-1.1.jar(hibernate对事务的处理) 7.slf4j-api-1.6.4.jar(一个日志系统的服务的api) 8.slf4j-nop-1.6.4.jar(对slf4j-api-x.x.x.jar的一个实现) 9.ojdbc14.jar (oracle驱动) 10.mysql-connector-java-...
6.jta-1.1.jar(hibernate对事务的处理) 7.slf4j-api-1.6.4.jar(一个日志系统的服务的api) 8.slf4j-nop-1.6.4.jar(对slf4j-api-x.x.x.jar的一个实现) 9.ojdbc14.jar (oracle驱动) 10.mysql-connector-java-...
从Spring配置分离@Entity定义 v. 67.5. 配置JPA属性 vi. 67.6. 使用自定义的EntityManagerFactory vii. 67.7. 使用两个EntityManagers viii. 67.8. 使用普通的persistence.xml ix. 67.9. 使用Spring Data JPA和...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...
Spring4GWT GWT Spring 使得在 Spring 框架下构造 GWT 应用变得很简单,提供一个易于理解的依赖注入和RPC机制。 Java扫雷游戏 JVMine JVMine用Applets开发的扫雷游戏,可在线玩。 public class JVMine extends java...