多数据源配置

多数据源配置介绍视频: 如何在ORM引擎中同时访问多个数据库

数据源管理

NopOrm引擎中每个querySpace对应于一个独立的DataSource。

可以配置多个DataSource,命名格式为 nopDataSource_{querySpace}。后缀名对应于querySpace

<bean id="nopDataSource_test"
class="com.zaxxer.hikari.HikariDataSource">
<constructor-arg index="0">
<bean class="com.zaxxer.hikari.HikariConfig">
<property name="driverClassName" value="org.h2.Driver"/>
<property name="jdbcUrl" value="jdbc:h2:mem:test"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
<property name="maximumPoolSize" value="8"/>
</bean>
</constructor-arg>
</bean>

dao-defaults.beans.xml中配置了nopTransactionManager,它自动收集所有前缀为nopDataSource_的数据源定义


<bean id="nopTransactionManager" ioc:default="true"
class="io.nop.dao.txn.impl.DefaultTransactionManager">
<property name="defaultFactory" ref="nopTransactionFactory"/>

<property name="dataSourceMap">
<ioc:collect-beans only-concrete-classes="true" as-map="true" name-prefix="nopDataSource_"/>
</property>

<property name="txnGroupMapConfig" value="@cfg:nop.dao.config.txn-group-map|"/>
<property name="transactionMetrics" ref="nopDaoMetrics"/>
</bean>

在运行时可以调用DefaultTransactionManager对象上的addQuerySpace/removeQuerySpace来动态增减数据源。

使用多数据源

1. 在orm.xml的实体定义上可以配置querySpace


<entity name="xxx.NopAuthUser" querySpace="test">...</entity>

2. 在sql-lib中可以配置querySpace


<sql-lib x:schema="/nop/schema/orm/sql-lib.xdef" xmlns:x="/nop/schema/xdsl.xdef">

<sqls>
<sql name="getAllLocations" querySpace="test" sqlMethod="findAll">
<source>
select location from test_geo
</source>
</sql>
</sqls>
</sql-lib>

3. 手工创建SQL对象并执行时可以指定querySpace

SQL sql=SQL.begin().sql("select * from xxx where id=?",3).querySpace("test").end();
jdbcTemplate.findFirst(sql);

4. 直接为数据源指定dialect

一般情况下会根据DataSource获取到Connection,然后猜测得到对应的数据库方言。如果需要,也可以直接指定

nop:
dao:
config:
query-space-to-dialect: test=h2gis

上面示例指定querySpace=test对应的数据源使用h2gis这个方言

数据库事务

在NopOrm引擎中,只有ormTemplate.flush()调用的时候才会执行数据库操作,只有在flush函数中才会真正打开JDBC事务。因此业务处理异常时一般还没有执行数据库更新动作,不涉及到数据库回滚的问题。

对于多数据源配置,我们可以配置多个querySpace对应于一个事务组,则提交的时候会先执行所有数据库访问操作,等所有数据库操作都执行成功之后再逐个commit。

nop.dao.config.txn-group-map= test=default

以上配置表示querySpace=test的数据库操作归属于default这个事务组

Excel模型配置

在表配置中,增加一个【查询空间】配置,通过它可以指定querySpace

动态切换数据源

通过QuerySpaceEnv可以动态切换default情况下实际使用的数据源

return QuerySpaceEnv.runInQuerySpace("test", () -> {
return doMyWork();
});

以上代码会在doMyWork()方法执行期间,将QuerySpaceEnv的defaultQuerySpace设置为”test”,doMyWork()
方法中的所有ORM操作如果没有明确指定querySpace,则会使用”test”数据源。

  • 所有明确指定的querySpace不会受到QuerySpaceEnv的影响。