随着业务的不断扩展数据库的压力越来越大,为了减少数据库的压力我们要从多方面考虑分析,并提出多个解决数据库压力大的问题,比如说根据业务分表、分库、增加缓存机制等等。如果是分库,如何做分布式呢?我就做分布式的库来讨论一下如何使用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. NVIDIA GPU上的直接线性求解器
  2. tensorflow中的lstm的state
  3. 调整屏幕亮度,调整字体大小
  4. 设计模式 -结构型模式_ 装饰者模式Decorator Pattern 在开源软件中的应用
  5. matlab画三维图电磁场,利用matlab实现矩形波导电磁场分布图的绘制.doc
  6. ZooKeeper命令、命令行工具及简单操作
  7. Oracle安装 - shmmax和shmall设置
  8. glide工具类。加载显示原图片,显示圆角图片,gif图标显示
  9. 计算机视觉模型、学习和推理
  10. python 水位_Leetcode 42. 接雨水 - python - 递归 查找分水岭
  11. 三种方式读取项目属性文件
  12. 绝对不可错过的图形学算法!迭代最近点算法——ICP算法
  13. java中下标和标识符_如下哪个是 Java 中的标识符 ( )_学小易找答案
  14. 扑克牌排序(结构体)
  15. 既生左,何生曾——曾国藩与左宗棠一生恩怨考
  16. 不一样的课程表,不一样的Excle--用Excle进行设计(12):网状结构
  17. 2017283418魏扬
  18. C# Revit二次开发基础/核心编程---建筑建模-标高和轴网
  19. Hash表(C语言)
  20. C#里@字符d是什么意思

热门文章

  1. (深度学习)前馈神经网络—全连接网络的一般流程
  2. 云开发山楂岛留言小程序带审核实现教程及源码
  3. HDU 1042 N!(大数阶乘)
  4. 微信小程序 |基于百度AI从零实现人脸识别小程序
  5. Logistic Regression(1)
  6. Git 的常规分支使用【dev和master】
  7. 为何上千名科技专家呼吁暂停大型AI研究?
  8. list对象转map stream /去重( 根据属性转Map或者分组)
  9. c语言程序设计期末考试卷,C语言程序设计期末考试试卷
  10. 27、安全的枚举类型