Hibernate和纯jdbc连接共同使用产生的事务问题

问题描述

最近在项目里遇到了一个问题,新系统持久化使用的是hibernate3,但是为了实现一些功能必须调用一个另外的老系统(和新系统是同一个数据库,部署在同一个wls的domain下)的jar包内提供的方法,但是这个老的系统持久化使用的是jdbc的方式连接的数据库,但是数据源的获取方式和新系统一样,都是通过jndi从wls上查找。可是这样就产生了事务问题,hibernate3的事务提交都是用spring控制的,而老系统的jar方法必须要手动commit才能提交事务,可是这样,一旦hibernate的事务异常,产生了回滚,jar包提供的方法持久化的数据就无法回滚。各位持久化方面的大师,有没有什么好的建议,怎么解决这个问题,或者有其他的方法让hibernate和jdbc的方式和平共处。问题补充:感谢各位的关注,不过我找到了一个刚好的方法,Spring里有个DataSourceUtil的类,通过getConnection方法可以把当前连接和当前线程绑定,这样两种持久化的方式使用的是同一个connection,也就达到了事务一致。

解决方案

可以用JOTM或者类似的JTA来做这个事情。也就是说把JDBC和Hibernate当成跨数据库事务来做,就算是同一个数据库schema。下面一JOTM为例子。<?xml version="1.0" encoding="UTF-8"?><beans> <bean id="jotm" class="org.springframework.transaction.jta.JotmFactoryBean"/><!-- transactionManagerHibernate 这个作为Hibernate的transactionManager --> <bean id="transactionManagerHibernate" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="userTransaction" ref="jotm"/> </bean><!-- 内部数据源 1 --> <bean id="innerDataSourceJDBC" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="..."/> <property name="url" value="..."/> <property name="user" value="..."/> <property name="password" value="..."/> </bean><!-- 用继承这个类改写,并实现InitializingBean,在afterProperty把这个数据绑定到JDBC要用到的JNDI名字上!!! --> <bean id="dataSourceJDBC" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource" ref="innerDataSource"/> <property name="user" value="..."/> <property name="password" value="..."/> <property name="maxSize" value="..."/> </bean> <!-- 内部数据源 2 --> <bean id="innerDataSourceHibernate" class="org.enhydra.jdbc.standard.StandardXADataSource" destroy-method="shutdown"> <property name="transactionManager" ref="jotm"/> <property name="driverName" value="..."/> <property name="url" value="..."/> <property name="user" value="..."/> <property name="password" value="..."/> </bean><!-- 把此数据源给spring内的Hibernate使用,替换原来从JNDI获得的数据源。 --> <bean id="dataSourceHibernate" class="org.enhydra.jdbc.pool.StandardXAPoolDataSource" destroy-method="shutdown"> <property name="dataSource" ref="innerDataSourceHibernate"/> <property name="user" value="..."/> <property name="password" value="..."/> <property name="maxSize" value="..."/> </bean> </beans>原理:从上面两个数据源获得的数据库连接(都是org.enhydra.jdbc.standard.StandardXAConnection)都在JTA控制之下,其中一个连接失败,那么另外一个会回滚。难点是将spring的数据源绑定到JNDI,因为我没做过。。。。
解决方案二:
让老系统的Service提供一个方法, 只是用于抛出一个异常.新系统的servcie发现这边抛了异常, 直接调用老系统的service 让它也抛一个异常.理论上最简单,最可行.等你真正要研究 Hibernate和JDBC整合的时候,再用楼上的代码即可.
解决方案三:
Hibernate回调JDBC模板

时间: 2024-12-02 04:47:53

Hibernate和纯jdbc连接共同使用产生的事务问题的相关文章

JDBC连接各种数据库经验技巧集萃

技巧|数据|数据库 Java数据库连接(JDBC)由一组用 Java 编程语言编写的类和接口组成.JDBC 为工具/数据库开发人员提供了一个标准的 API,使他们能够用纯Java API 来编写数据库应用程序.然而各个开发商的接口并不完全相同,所以开发环境的变化会带来一定的配置变化.本文主要集合了不同数据库的连接方式. 一.连接各种数据库方式速查表 下面罗列了各种数据库使用JDBC连接的方式,可以作为一个手册使用. 1.Oracle8/8i/9i数据库(thin模式) Class.forName

sql server-使用JDBC连接目标数据库会影响对方机器的负载/性能么

问题描述 使用JDBC连接目标数据库会影响对方机器的负载/性能么 最近在做一个项目,要在一个内部网络中安放一台机器来实时获得内部网络中数据库的内容,并不要影响对方机器的性能(也就是不影响对方的事务操作),使用HIBERNATE/JDBC来实现,初步想法是实时监控对方机器的负载/性能,选择负载低的时候去获取数据,现在我想知道使用JDBC会影响对方的负载/性能么,如果会的话,有哪些指标能衡量对方数据库的负载/性能呢(并给出获取指令),对方数据库类型有MySQL.SQL Server和Oracle三种

cassandra入门(一):jdbc连接cassandra作增删改查

先分享一个最新的cassandra-java-driver文档,点击电子书分享里的链接,找到javaDriver21.pdf. 该文档内容比较全,包含:jdbc连接cassandra集群,执行cql增删改查,批量查询,异步查询,cql的类型和java类型的映射关系及用户自定义类型使用,ORM等. Cassandra是一个NoSql数据库,纯java编写,apache的顶级项目,主页:http://cassandra.apache.org/(简介不多说网上有). 入门步骤:(我的jdk版本是1.7

spring 配置文件中dbcp连接池,jdbc连接池 引入 配置文件properties,但是不能用$符号引用里面的变量问题

spring 配置 注意红色字体 (1)懒加载要设为true,(2)引入配置文件  注意不能懒加载不能设为false,否则$不能引入配置文件中的变量 第一种配置 jdbc连接池 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3

JDBC连接Access数据库的几种方式介绍_JSP编程

接下来总结一下常用的几种连接方式. 例如有如下的Access数据库student,表basic,以及6条记录,现在通过几种方式在Jsp中将他们的数据显示出来.如图所示: 对于几种连接Access数据库的方式,基本上都是基于JDBC-ODBC方式的,当然也有纯JDBC驱动的方式.这里我暂时就不说了.对于这几种方式,除了取得连接之处不同外,其他的代码都是一样的.所以这里先写出取得连接的几种方式,然后再用完整的代码进行显示. 方式一:通过JDBC-ODBC方式桥连直接连接: 1.对于这种方式,首先要建

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术. 一.JDBC基础知识 JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,能够为多种关系数据库提供统一訪问,它由一组用Java语言编写的类和接口组成.JDBC为数据库开发者提供了一个标准的API,据此能够构建更高级的工具和接口,使数据库开发者能够用纯 Java API 编写数据库应用程序,而且可跨平台执行,而且不受数据库供应商的限制. 1.跨平台执行:

sql2000和sql2005共存时,jdbc连接的写法

问题描述 我的机器上安装了sql2000和sql2005,sql2000用的是默认实例,sql2005的实例名是SQL2005,jdbc:sqlserver://localhost:1433;databaseName=gmmsdb发现连接的数据库是sql2000中的,怎么样写才能连接到sql2005中的数据库gmmsdb呢 解决方案 解决方案二:声明两套jdbc的连接属性(url,account,passwod),按需选择,获取连接.解决方案三:<propertyname="hiberna

如果用纯JDBC做DAO层的话?

问题描述 问下,如果用纯JDBC做DAO层的话?类中关联的对象在哪层设置进去好呢?在hibernate里的一对一对关系中,hibernate取的时候自动会将关联的对象同时取出来,然后设置进去,如果用JDBC,那要手动设置,但是,在哪层设置比较好呢,在service层还是控制层,还是dao层呢?望高手解答,谢谢 解决方案 解决方案二:DAO层解决方案三:感觉还是在DAO层比较好service只负责分配数据数据間的关系还是不让其干预好解决方案四:我觉得在dao层比较好,不过还要看具体的吧,看你用的是

Hibernate单向1-1含连接表映射实例详解

Hibernate单向1-1映射范例 其实 Many-to-one 和 one-to-one 非常相似,只需要在 <many-to-one> 的尖括号中添加 unique="true"即可 1.hibernate.cfg.xml  代码如下 复制代码 <!DOCTYPE hibernate-configuration PUBLIC         "-//Hibernate/Hibernate Configuration DTD 3.0//EN"