-
Notifications
You must be signed in to change notification settings - Fork 3k
动态数据源
zhōuhào edited this page Dec 9, 2017
·
2 revisions
hsweb提供了动态数据源功能,hsweb-datasource-api
实现简单的多数据源,不支持多数据源事务。使用时。直接向spring容器声明多个DataSource
即可.你还可以使用jta
(atomikos
)管理动态数据源事务,可实现数据源热修改,事务中切换数据源.
引入动态数据源jta实现
<dependency>
<groupId>org.hswebframework.web</groupId>
<artifactId>hsweb-datasource-jta</artifactId>
<version>${hsweb.framework.version}</version>
</dependency>
- 配置默认数据源 默认数据源配置,使用spring的jta配置即可:
spring:
jta:
status: true
atomikos:
datasource:
xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
xa-properties:
url : jdbc:h2:mem:core;DB_CLOSE_ON_EXIT=FALSE
username : sa
password :
max-pool-size: 20
borrow-connection-timeout: 1000
connectionfactory:
max-pool-size: 20
local-transaction-mode: true
- 动态数据源配置
动态数据源配置,默认提供一个
MemoryJtaDataSourceRepository
,在application.yml 中进行配置即可:
hsweb:
dynamic:
datasource:
test_ds: # 数据源ID
xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
xa-properties: # 数据源的配置属性
url: jdbc:h2:mem:test;DB_CLOSE_ON_EXIT=FALSE
username: sa
password:
max-pool-size: 20
borrow-connection-timeout: 1000
test_ds2: # 数据源ID
xa-data-source-class-name: com.alibaba.druid.pool.xa.DruidXADataSource
xa-properties: # 数据源的配置属性
url: jdbc:mysql://localhost:3306/hsweb?pinGlobalTxToPhysicalConnection=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false
# url: jdbc:h2:mem:test2;DB_CLOSE_ON_EXIT=FALSE
username: root
password: 123456
max-pool-size: 20
borrow-connection-timeout: 1000
init-timeout: 20
如果需要将数据源配置放到数据库中或其他地方,实现 JtaDataSourceRepository
接口并注入到spring容器即可.
@UseDataSource("test_ds")
String insert(MyEntity);
@UseDataSource("test_ds2")
MyEntity selectByPk(String id);
@UseDefaultDataSource()
MyEntity selectByPk(String id);
//切换到 id为test_ds的数据源
DataSourceHolder.switcher().use("test_ds");
// ....
//切换到 id为test_ds2的数据源
DataSourceHolder.switcher().use("test_ds2");
// ....
// 切换到上一次使用的数据源 (test_ds)
DataSourceHolder.switcher().useLast();
// ...
// 切换到默认的数据源
DataSourceHolder.switcher().useDefault();
//重置设置
DataSourceHolder.switcher().reset();