当前位置:首页>正文

spring使用Hibernate配置双数据源事务问题怎么解决 Spring jdbcTemplate配置事务处理无效

2023-06-28 06:09:49 互联网 未知

spring使用Hibernate配置双数据源事务问题怎么解决

在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难。最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难搞。在上一篇中,我探讨了SpringSide 3 中的数据访问层,在这一篇中,我立志要解决多数据源配置的难题,我的思路是这样的:

第一步、测试能否配置多个DataSource
第二步、测试能否配置多个SessionFactory
第三步、测试能否配置多个TransactionManager
第四步、测试能否使用多个TransactionManager,也就是看能否配置多个

基本上到第四步就应该走不通了,因为Spring中似乎不能配置多个,而且@transactional注解也无法让用户选择具体使用哪个TransactionManager。也就是说,在SpringSide的应用中,不能让不同的数据源分别属于不同的事务管理器,多数据源只能使用分布式事务管理器,那么测试思路继续如下进行:

第五步、测试能否配置JTATransactionManager

如果到这一步,项目还能顺利在Tomcat中运行的话,我们就算大功告成了。但我总认为事情不会那么顺利,我总觉得JTATransactionManager需要应用服务器的支持,而且需要和JNDI配合使用,具体是不是这样,那只有等测试后才知道。如果被我不幸言中,那么进行下一步:

第六步、更换Tomcat为GlassFish,更换JDBC的DataSource为JNDI查找的DataSource,然后配置JTATransactionManager

下面测试开始,先假设场景,还是继续用上一篇中提到的简单的文章发布系统,假设该系统运行一段时间后非常火爆,单靠一台服务器已经无法支持巨大的用户数, 这时候,站长想到了把数据进行水平划分,于是,需要建立一个索引数据库,该索引数据库需保存每一篇文章的Subject及其内容所在的Web服务器,而每 一个Web服务器上运行的项目,需要同时访问索引数据库和内容数据库。所以,需要创建索引数据库,如下:

[java] view plain copy print?
create database puretext_index

use puretext_index

create table articles(
id int primary key auto_increment,
subject varchar(256),
webserver varchar(30)
)
create database puretext_index

use puretext_index

create table articles(
id int primary key auto_increment,
subject varchar(256),
webserver varchar(30)
)
第一步测试,配置多个DataSource,配置文件如下:
application.properties

Spring jdbcTemplate配置事务处理无效

貌似不是这么配置的吧。




PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED





org.framework.xxx..*

spring mybatis 多数据库事务管理:一个方法里面能同时对两个数据库的数据进行操作

1. 定义两个DAO分别使用不同的数据源,ADAO连接A数据库,BDAO连接B数据库
2. 定义一个Service类,加上Spring注解@Transactional,表示进行事务管理。
将ADAO和BDAO注入到Service类里面。
在service类里面创建一个方法,方法里调用ADAO的方法插入数据到A数据库的user表,然后调用BDAO的方法插入数据到B数据库的user表

spring 两个数据源 怎么配事务

使用JTA事务,jboss,weblogic,websphere 等等ejb容器都自带了jta事务的支持,如果你使用tomcat,jetty或者其他web容器,则需要安装第三方的jta插件,假定这里使用jboss容器,则需要在jboss中配置JNDI数据源,比如有两个mysql的数据源需要被JTA管理,则需要在jboss的server/default/deploy目录下新建两个数据源文件app1-ds.xml和app2-ds.xml,这里只拿一个文件做例子,内容如下所示:


MySqlDS1

com.mysql.jdbc.jdbc2.optional.MysqlXADataSource


jdbc:mysql://localhost:3306/test

root
root
false
true

org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter


mySQL



完成JNDI数据源配置后,需要在spring中获取JNDI数据源,配置如下:








然后定义JTA事务如下:
class="org.springframework.transaction.jta.JtaTransactionManager">



通过声明式事务模板(代理),指定目标类的特定方法采用JTA事务:
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">








PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED



追问




在配置sql-map-config.xml 中如果有两个数据源那么着 DataSource 是不是应该配置两个,如果是 两个名字一样,如果不是那么应该怎么来配置这个。UserTransaction的value指的什么?
回答
是应该配置两个,但是为什么要配置两个数据源名字一样呢?既然是两个不同的数据库,数据源名字怎么可能一样。

java:/ctx/con/UserTransaction 是指spring访问EJB容器的资源,即容器拥有的JTA事务的API,是特定的接口,可以理解为JTA事务的驱动,不同的容器所拥有的API是不一样的,如下所示:

JBoss: "java:/ctx/con/UserTransaction"
WebLogic: "javax.transaction.UserTransaction"
WebSphere: "java:comp/UserTransaction"
追问
在我启动的时候出现了
Error initializing JtaTransactionConfig while looking up UserTransaction (java:/ctx/con/UserTransaction). Cause: javax.naming.NameNotFoundException: ctx not bound
请问下,这个空间命名,需要我自己添加 还是jboss中就有了这样的空间命名。如果没有 应在怎样添加这个文件
回答
将jbossdocsexamplesjca下的mysql-ds.xml拷贝到jbossserverdefaultdeploy下,并做相应修改,主要内容如下:


UserTransaction
jdbc:mysql://localhost:3306/abcdef
com.mysql.jdbc.Driver
root
root
org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSortersorter-class-name>

mySQL


springboot事务异常回滚了,error不回滚,为什么?

新建Spring Boot项目,依赖选择JPA(spring-boot-starter-data-jpa)和Web(spring-bootstarter-web)。

配置基本属性 在application.properties里配置数据源和jpa的相关属性
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=12345spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jackson.serialization.indent_output=true

定义映射实体类

定义Controller类
@RestControllerpublic class PersonCtroller {
@Autowired PersonServer personServer
@RequestMapping("/rollback")
public Person rollback(Person person){
return personServer.savePersonWithRollBack(person)
}
@RequestMapping("/norollback")
public Person noRollback(Person person){
return personServer.savePersonWithOutRollBack(person)
}
}
定义数据访问层
public interface PersonRepository extends JpaRepository {}
定义Server层
@Servicepublic class PersonServerImp implements PersonServer {
@Autowired
PersonRepository personRepository

相关文章

随便看看