问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring如何生成带事务的多数据源

发布网友 发布时间:2022-04-23 14:36

我来回答

1个回答

热心网友 时间:2022-04-08 01:59

我为这个问题专门写了一个测试用例:

看下面的几个文件:
可能贴的顺序上有点问题,楼主可以自己整理一下:

(1) applicationContext.xml

---------------------

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "">

<beans>
<!-- 引入参数配置文件 -->
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>jdbc.properties</value>
</list>
</property>
</bean>

<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass"><value>$</value></property>
<property name="jdbcUrl"><value>$</value></property>
<property name="user"><value>$</value></property>
<property name="password"><value>$</value></property>
<property name="initialPoolSize"><value>$</value></property>
<property name="minPoolSize"><value>$</value></property>
<property name="maxPoolSize"><value>$</value></property>
</bean>

<!-- spring Hibernate SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.jdbc.fetch_size">80</prop>
<prop key="hibernate.jdbc.batch_size">35</prop>
</props>
</property>
<property name="mappingResources">
<list>
<value>com/spring/demo/bean/mapping/Book.hbm.xml</value>
</list>
</property>
</bean>

<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>

<!-- 事务代理*的配置 -->
<bean id="baseTransactionProxy" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="delete*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

<bean id="hibernate_BookDao" class="com.spring.demo..Hibernate_BookDao" >
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>

<bean id="hibernate_BookManager" parent="baseTransactionProxy">
<property name="target">
<bean class="com.spring.demo.manager.Hibernate_BookManager">
<property name="">
<ref bean="hibernate_BookDao"/>
</property>
</bean>
</property>
</bean>

</beans>

---------------------

(2) jdbc.properties
## 这个事连接mysql数据库的具体参数配置,
## 楼主要根据自己的数据来配置,不可直接使用
---------------------

jdbc.driverClass=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/springdemo?useUnicode=true&characterEncoding=utf-8

jdbc.user=root
jdbc.password=root
jdbc.initialPoolSize=1
jdbc.minPoolSize=1
jdbc.maxPoolSize=10

---------------------

说明:applicationContext.xml 应用了jdbc.properties文件

,我自己测试,没有问题,而且是spring配置式事务的。

需要JAR包

spring.jar
c3p0.jar
mysql.jar
cglib.jar
asm.jar
antlr.jar
hibernate3.jar
jta.jar
dom4j.jar
commons-collections.jar
commons-logging.jar

-----------

Hibernate_BookDao.java

--------------

package com.spring.demo.;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.spring.demo.bean.Book;

/**
*
* @author wangyudong
*
*/
public class Hibernate_BookDao extends HibernateDaoSupport {

/**
* 添加一本书
* @param book
*/
public void insertBook(Book book){
this.getHibernateTemplate().save(book);
}

/**
* 修改一本书
* @param book
*/
public void updateBook(Book book){
this.getHibernateTemplate().update(book);
}

/**
* 根据ID来删除一本书
* @param id
*/
public void deleteBook(Integer id){
Book book = new Book();
book.setId(id);
this.getHibernateTemplate().delete(book);
}

/**
* 根据ID来查询书对象
* @param id
* @return
*/
public Book selectBookById(Integer id){
String hql = "from Book b where b.id=?";
Object[] params = new Object[];
List list = this.getHibernateTemplate().find(hql, params );

if(list!=null && list.size()>0){
return (Book)list.get(0);
}
return null ;
}

/**
* 根据书名来查询相关*录列表
* @param name
* @return
*/
public List selectBookByName(String name){

String hql = "from Book b where b.name like ?";
Object[] params = new Object[];
return this.getHibernateTemplate().find(hql, params);
}

}

--------------

(2) Hibernate_BookManager.java

---------------

package com.spring.demo.manager;

import java.util.List;

import com.spring.demo.bean.Book;
import com.spring.demo..Hibernate_BookDao;

public class Hibernate_BookManager {

private Hibernate_BookDao ;

/**
* 批量添加书本,如果列表长度超过3,就抛出异常
* @param books
*/
public void insertBooks(List books){

for(int i=0 ; i<books.size() ;i++){
if(i>2){
throw new RuntimeException("中断事务异常,当列表长度大于3的时候故意抛出,看看事务是否回滚");
}
Book book = (Book)books.get(i);
.insertBook(book);
}
}

/**
* 添加一本书
* @param book
*/
public void insertBook(Book book){
this..insertBook(book);
}

/**
* 修改一本书
* @param book
*/
public void updateBook(Book book){
this..updateBook(book);
}

/**
* 根据ID来删除一本书
* @param id
*/
public void deleteBook(Integer id){
this..deleteBook(id);
}

/**
* 根据ID来查询书对象
* @param id
* @return
*/
public Book selectBookById(Integer id){
return this..selectBookById(id);
}

/**
* 根据书名来查询相关*录列表
* @param name
* @return
*/
public List selectBookByName(String name){
return this..selectBookByName(name);
}

// getter and setter //
public Hibernate_BookDao getDao() {
return ;
}

public void setDao(Hibernate_BookDao ) {
this. = ;
}
}

---------------

(3)Book.java

--------------
package com.spring.demo.bean;

import java.io.Serializable;

/*

DROP TABLE IF EXISTS book ;

CREATE TABLE book(
id int(11) NOT NULL auto_increment COMMENT 'primary key',
name varchar(60) default NULL COMMENT 'book name',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='my book table';

*/

public class Book implements Serializable {

public Book(){}

public Book(String name){
this.name = name;
}

/**
* ID
*/
private Integer id ;

/**
* 书名
*/
private String name ;

// getter and setter
public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

}
--------------

(4)Book.hbm.xml
---------------
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">

<hibernate-mapping>
<class name="com.spring.demo.bean.Book" table="BOOK" >
<id name="id" type="integer" length="11">
<column name="id" />
<generator class="identity" />
</id>

<property name="name" column="NAME" type="string" length="60" ></property>

</class>
</hibernate-mapping>
---------------

#mysql的造表语句,指定了数据库springdemo#
---------------------
MYSQL 的BOOK 表创建语句

CREATE DATABASE IF NOT EXISTS springdemo;

USE springdemo;

DROP TABLE IF EXISTS book ;

CREATE TABLE book(
id int(11) NOT NULL auto_increment COMMENT 'primary key',
name varchar(60) default NULL COMMENT 'book name',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='my book table';

---------------------

下面是我的测试方法:
===========

package com.spring.demo;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.demo.bean.Book;
import com.spring.demo.manager.Hibernate_BookManager;

public class HibernateDemo {

/**
* @param args
*/
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml") ;

Hibernate_BookManager manager = (Hibernate_BookManager)context.getBean("hibernate_BookManager");

List books = new ArrayList();

books.add(new Book("book_01"));
books.add(new Book("book_02"));
books.add(new Book("book_03"));
books.add(new Book("book_04"));

manager.insertBooks(books);

System.out.println("OK");

}

}

确信是调通的,
==================

看在我专门为回答这个问题写了这个测试用例,
给个高分?
springboot+mybatis是如何配置多数据源的?

在Spring Boot中配置多数据源的步骤包括:首先,在pom.xml文件中引入Spring Boot Data JPA和MySQL的依赖。接下来,在application.properties或application.yml文件中配置两个数据源。创建两个数据源的配置类,使用@ConfigurationProperties注解将配置文件中的属性绑定到DataSource对象上。通过这种方式,你可以为应...

多数据源 spring怎么管理事务的

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

spring 怎么实现注入多个数据源,并且可以同时使用这多个数据源

如果只是在一个Service里面固定的用一个数据源,则可以在注入数据源的时候指定要注入的是哪个数据源,如果需要在运行时动态的决定要用哪个数据源,则可以把这些数据源都注入到Service,可以选择List&lt;DataSource&gt;这样的结构注入,当然最优的处理方式是抽取出来一个管理类,管理类里面注入所有的数据源,然后Ser...

Spring动态配置多数据源基于spring和ibatis的多数据源切换方案_百度知 ...

即使在项目初期采用单数据源,随着项目发展需要切换到多数据源,只需修改Spring配置,稍作调整MVC层以指定数据源名,即可完成切换。反之,若要回退到单数据源模式,只需在配置文件中做简单修改。这种灵活性为项目管理带来了很大的便利,提升了项目的可扩展性和适应性。

【微服务】Spring Boot 多数据源配置与实现详解

1. 多数据源基础 在单一系统中运用多个独立数据源,是Spring Boot默认配置之外的扩展。在实际业务场景中,多数据源配置变得尤为重要。2. 应用场景 读写分离:减少对单个数据库的压力,提高读取性能。 数据库分片:处理大量数据,提升存储和查询效率。 多租户:每个租户独立使用自己的数据源,...

spring 两个数据源 怎么配事务

完成JNDI数据源配置后,需要在spring中获取JNDI数据源,配置如下:&lt;bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean"&gt; &lt;property name="jndiName" value="MySqlDS1" /&gt; &lt;property name="lookupOnStartup" value="true" /&gt; &lt;/bean&gt; &lt;bean id="dataSource2" class="...

spring服务中怎么实现mybatis多数据源动态切换?

Spring框架中的AbstractRoutingDataSource类是实现多数据源动态切换的关键。它作为数据源的封装,通过路由机制将数据库请求分发至不同的目标数据源,满足复杂业务需求、提升系统性能、增强灵活性。AbstractRoutingDataSource继承了DataSource接口,包含determineTargetDataSource方法,用于获取当前目标数据源标识符,并...

SpringBoot实现动态数据源配置

现在,我们要实现多数据源,并能够自动切换。例如,查询A时连接行云数据库,查询B时连接OceanBase数据库。由于不能使用DataSourceAutoConfiguration,我们需要使用exclude排除它。然后,Spring Boot提供了AbstractRoutingDataSource抽象类,它可以根据用户定义的规则选择当前的数据源。AbstractRoutingDataSource是一个...

实用:Spring的多租户数据源管理 AbstractRoutingDataSource!

在实际项目中,我们常常需要在单一服务中访问多个数据源,以满足不同业务需求或实现多租户等功能。这使得系统设计变得复杂,但Spring框架提供了AbstractRoutingDataSource类,为管理多个数据源提供了方便的解决方案。AbstractRoutingDataSource的核心在于其动态路由机制。通过重写其内部方法determineCurrentLookupKey()...

springboot+springJdbc+postgresql实现多数据源的配置

t_default");returndao;}特别注意的,一定要配置的,因为现在有多数据源了就要配置对应的事务配置,单个默认的,多个就要指定ConfigurationpublicclassTransactionConfig{@BeanpublicPlatformTransactionManagerbfscrmTransactionManager(@Qualifier("masterDataSource")DataSourcemasterDataSource){returnnewDataSource...

spring配置多个数据源多事务 spring多数据源事务管理 spring动态数据源事务 spring数据库事务 spring多数据源配置 事务中如何切换数据源 springboot 多数据源 多数据源事务不生效 springboot动态多数据源
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
幼儿园老师体罚学生会受到什么样的处罚? 幼儿园老师体罚孩子构成犯罪吗?法律对老师体罚孩子怎样规定的? 怎恶把照片做成黑莓8700的壁纸最好是高清的。 为什么苹果手机勿扰模式还有电话打来? 为什么iphone阻止来电还是能打进来? 高分悬赏[北京五中分校]作息时间 有一本bl小说讲一个特种兵穿越,和军人结婚的,其中有一个片段是他在 一台电脑能配2块不同型号的内存条使用吗? MUGEN 谁有会死星的零子人物包?求发. mugen 求一个人物包,宇宙意志大蛇,不是准神的那个,是隔离的。最好... 用CAD画好图后怎样保存? 如何在spring框架中解决多数据源的问题(2) 如何在一个Spring工程下使用多数据源配置的改进实现 Spring动态配置多数据源的介绍 cad已经画好的图怎么改比例? 安全可靠的手机图片恢复软件 Spring怎样高效的配置多套数据源 照片恢复软件会不会泄露隐私? Spring动态配置多数据源的简介 如何在spring配置多个数据源 私密照用手机照片恢复大师安全吗? spring 怎么实现注入多个数据源,并且可以同时使用这多个数据源 如何在spring框架中解决多数据源的问题 求日本恋爱动漫 谁知道毗湿奴是怎么来的吗?(我要详细的故事、要是有佛经举例就最好了) 拳皇200人人物包 恢复手机照片,哪个软件比较好用? mugen游戏下载 鲁格赛特被打败,究极生命体·塔尔塔罗斯登场,你怎么看? 大家快看拳皇最终BOOS不是大蛇!EVIL ASH(黑化阿修)绝对比大蛇强! CAD画好实体图后如何在.. 多数据源 spring怎么管理事务的 CAD中画好了图怎么打印出来图很小呢? springboot整合多数据源 spring 最多可以配多少个数据源 cad画好的图怎样打印 CAD图画好后怎样分图层 软件测试中覆盖是什么意思 等价类划分的等价类划分的方法 多个等价类时覆盖一个无效等价类时其他有效等价类需要满足吗 等价类划分为什么要区分有效等价类和无效等价类 爱国者充电宝飞机上可以携带吗? 黑盒测试方法有哪些覆盖方法 出国坐飞机可以携带20000毫安的爱国者充电宝吗? 大神,求计算机三级软件测试技术的历年真题或复习资料 爱国者30000充电宝能带上飞机吗 等价类划分法的设计思想是什么 爱国者这款充电宝能带上飞机吗? 软件测试分为白盒测试和黑盒测试,等价类划分法属于什么测试? 爱国者11200mAh的充电宝可以带上飞机吗