随着业务的不断扩展数据库的压力越来越大,为了减少数据库的压力我们要从多方面考虑分析,并提出多个解决数据库压力大的问题,比如说根据业务分表、分库、增加缓存机制等等。如果是分库,如何做分布式呢?我就做分布式的库来讨论一下如何使用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&amp;characterEncoding=utf-8&amp;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。

总结:在传统业务中如果单纯的为了减少数据的压力而采读写分离,而采用分布式事务管理其实是不合适的。采用分布式事务管理因采用两阶段提交,增加了响应时间,无形的增加了应用的压力,因此鄙人认为这并不是一个好的减少数据库压力的解决方案。我们可以从其他方式来解决数据库的压力,比如缓存。

Sping +hibernate+JTA 注解配置相关推荐

  1. Hibernate实例--注解配置表映射

    本实例使用Hibernate注解的方式实现一个实体类与数据库表持久化操作. 一.Hibernate注解详细介绍 实体Bean,每个持久化POJO类都是一个实体Bean, 通过在类的定义中使用 @Ent ...

  2. Hibernate 注解配置

    近几年来,注解方式的配置因其简单易用的特点深受广大程序员的青睐,Hibernate也添加了对注解配置的支持.接下来我们就以论坛系统为例来讲解基于注解配置实体类和表的映射关系,以及实体和实体的关联关系. ...

  3. Hibernate注解开发-PO类注解配置

    在hibernate中我们使用注解,可以帮助我们简化hbm文件配置. hibernate.cfg.xml配置 <?xml version="1.0" encoding=&qu ...

  4. Hibernate实体映射配置1(java@注解方式)

    实体和数据库之间存在某种映射关系,hibernate根据这种映射关系完成数据的存取.在程序中这种映射关系由映射文件(*.hbm.xml)或者java注解(@)定义. 本文以java注解的形式总结映射关 ...

  5. Hibernate 教程(二)[Hibernate对象的,xml配置,注解配置]

    准备 数据库建表(Hibernate可以自动生成表,和对应字段,但是不能给字段添加注释,所以选择手动建表) -- 创建表 CREATE TABLE `Event`( `id` INT AUTO_INC ...

  6. hibernate 多对多注解配置

    1.在公司一个员工对应多个部门,一个部门对应多个员工,因此部门与员工之间就是多对多的关系. Person类的代码如下: package com.mr.cheng.bean;import java.ut ...

  7. Spring+Hibernate的典型配置

    Spring 框架提供了对 Hibernate.JDO 和 iBATIS SQL Maps 的集成支持.Spring 对 Hibernate 的支持是第一级的,整合了许多 IOC 的方便特性,解决了许 ...

  8. Hibernate JPA 缓存配置

    Hibernate JPA 缓存配置 1.一级缓存 一级缓存指的是 EntityManager 级的缓存,对于这样的缓存几乎是一直存在的,也就是说只要用户进行JPA的操作,那么就永远都会存在有一级缓存 ...

  9. Java注解和xml_Spring注解配置和xml配置优缺点比较

    Spring注解配置和xml配置优缺点比较 编辑 ​ 在昨天发布的文章<spring boot基于注解方式配置datasource>一文中凯哥简单的对xml配置和注解配置进行了比较.然后朋 ...

最新文章

  1. eclipse安装springtoolsuite-4-4.8.1失败,是eclipse版本不匹配吗
  2. tlf 如何添加下划线
  3. android 7.0 调用系统相机崩溃的解决方案(非谷歌官方推荐)
  4. 科大星云诗社动态20210325
  5. Map.putAll方法——追加另一个Map对象到当前Map集合
  6. MUI tab选项卡之间的切换和数据获取
  7. 机器学习里面常用知识
  8. 利用MySQL存储过程分割字符串
  9. Java 能抵挡住 JavaScript 的进攻吗?
  10. PullToRefreshListView相关
  11. 转:完整的最简单的谱聚类python代码
  12. ffmpeg4.3.2版本:gstavdemux.c:486:24: error: AVStream has no member named ‘index_entries‘(二十七)
  13. IT人都是技术宅?NO,他们完全刷新了我们的认知
  14. ubuntu php命令行模式,在命令行ubuntu 16.04上切换php版本
  15. 实现有管理功能的ASP留言板
  16. html中加载gif图片,使用CSS3实现动态加载gif图片的效果
  17. 转自瑞星:“永恒之蓝”WannaCry勒索病毒分析报告
  18. 批处理文件(bat文件)注册dll批量注册dll
  19. latex linux 安装教程,Deepin安装LaTex,
  20. poj 1260 dp

热门文章

  1. 微信营销大师是一款什么软件
  2. 二分查找算法递归实现
  3. c 计算机二级考试试题,计算机二级c语言考试试题及答案
  4. 基于SU-03T语音模块的超声波拍照系统
  5. DHCP两种地址池与中继的理解与应用【eNSP实现】
  6. 【Codecs系列】H.266开源编解码器:vvenc和vvdec介绍
  7. Top 100 大学
  8. 阿里云OSS文件上传下载工具类
  9. dto 转换为Do 工具类
  10. Excel教程:规范Excel表格设计,让工作效率提升百倍不止