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<DataSource>这样的结构注入,当然最优的处理方式是抽取出来一个管理类,管理类里面注入所有的数据源,然后Ser...
Spring动态配置多数据源基于spring和ibatis的多数据源切换方案_百度知 ...
即使在项目初期采用单数据源,随着项目发展需要切换到多数据源,只需修改Spring配置,稍作调整MVC层以指定数据源名,即可完成切换。反之,若要回退到单数据源模式,只需在配置文件中做简单修改。这种灵活性为项目管理带来了很大的便利,提升了项目的可扩展性和适应性。
【微服务】Spring Boot 多数据源配置与实现详解
1. 多数据源基础 在单一系统中运用多个独立数据源,是Spring Boot默认配置之外的扩展。在实际业务场景中,多数据源配置变得尤为重要。2. 应用场景 读写分离:减少对单个数据库的压力,提高读取性能。 数据库分片:处理大量数据,提升存储和查询效率。 多租户:每个租户独立使用自己的数据源,...
spring 两个数据源 怎么配事务
完成JNDI数据源配置后,需要在spring中获取JNDI数据源,配置如下:<bean id="dataSource1" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="MySqlDS1" /> <property name="lookupOnStartup" value="true" /> </bean> <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...