多数据源接入
<p class="shortdesc">业务服务有不同数据源间的同步以及多数据源使用场景。</p>
<section class="section" id="Multiple_data_sources__section_pg1_skg_bsb"><h2 class="doc-tairway">适用场景</h2>
<ol class="ol" id="Multiple_data_sources__ol_jlc_tkg_bsb">
<li class="li"><strong class="ph b">异构数据库</strong><p class="p">不同类型的数据库进行数据同步。</p><img class="image" id="Multiple_data_sources__image_ayb_clg_bsb" src="https://obs-cn-shanghai.fincloud.pinganyun.com/pacloud/20220910180812-18e3b15d9d60.png"></li>
<li class="li"><strong class="ph b">同构数据库</strong><p class="p">不同表结构 – 新老系统改造迁移过渡;单体式应用架构。</p><img class="image" id="Multiple_data_sources__image_wky_dlg_bsb" src="https://obs-cn-shanghai.fincloud.pinganyun.com/pacloud/20220910180812-12010cb09582.png"></li>
</ol>
</section>
<section class="section" id="Multiple_data_sources__section_atw_glg_bsb"><h2 class="doc-tairway"><strong class="ph b">准备工作</strong></h2>
<p class="p">完成开发环境搭建。</p>
</section>
<section class="section" id="Multiple_data_sources__section_hst_plg_bsb"><h2 class="doc-tairway"><strong class="ph b">接入指南</strong></h2>
<ol class="ol" id="Multiple_data_sources__ol_sgm_tlg_bsb">
<li class="li"><strong class="ph b">pom.xml引入pafa-cloud-support-jdbc</strong><div class="p">
<pre class="pre codeblock" id="Multiple_data_sources__codeblock_ur1_5lg_bsb"><code><dependencyManagement>
<dependencies>
<dependency>
<groupId>com.pingan.pafa.cloud</groupId>
<artifactId>pafa-cloud-dependencies</artifactId>
<version>{版本参考核心框架简介}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.pingan.pafa.cloud</groupId>
<artifactId>pafa-cloud-service-starter</artifactId>
</dependency>
<dependency>
<groupId>com.pingan.pafa.cloud</groupId>
<artifactId>pafa-cloud-support-jdbc</artifactId>
</dependency>
<!-- 按照实际从下面选择合适的数据库驱动 -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.2</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.4.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
</dependencies></code></pre>
</div></li>
<li class="li"><strong class="ph b">启动类修改</strong><ol class="ol" type="a" id="Multiple_data_sources__ol_flp_wlg_bsb">
<li class="li">禁止加载DataSourceAutoConfiguration。</li>
<li class="li"> Import MultiDataSourceRegister即可。</li>
</ol><div class="p">
<pre class="pre codeblock" id="Multiple_data_sources__codeblock_ntk_zlg_bsb"><code>@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@Import(MultiDataSourceRegister.class)
public class MultiDataSourceDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MultiDataSourceDemoApplication.class, args);
}
}
}</code></pre>
</div></li>
<li class="li"><strong class="ph b">配置说明</strong><p class="p">pafa.cloud.multi-datasource为多数据源的公共配置前缀。</p><p class="p">如下gz、sh分别对应不同的数据源名称。</p><p class="p">按照下面的配置写法,spring
boot会默认加载hikariCP数据库连接池配置以及数据库连接、用户、密码、驱动类配置:</p><div class="p">
<pre class="pre codeblock" id="Multiple_data_sources__codeblock_znr_jmg_bsb"><code>pafa.cloud.multi-datasource.gz.max-wait=2000
pafa.cloud.multi-datasource.gz.max-active=50
pafa.cloud.multi-datasource.gz.test-on-borrow=true
pafa.cloud.multi-datasource.gz.initial-size=10
pafa.cloud.multi-datasource.gz.idle-timeout=60000
pafa.cloud.multi-datasource.gz.connection-timeout=6000
pafa.cloud.multi-datasource.gz.auto-commit=false
pafa.cloud.multi-datasource.gz.mybatis.auto_assemble.enabled=true
pafa.cloud.multi-datasource.gz.mybatis.mapperLocations=classpath:mapper/gz/UserInfoMapper.xml
pafa.cloud.multi-datasource.sh.url=jdbc:postgresql://1.1.1.1:5432/pafa_aaa
pafa.cloud.multi-datasource.sh.username=****
pafa.cloud.multi-datasource.sh.password=****
pafa.cloud.multi-datasource.sh.max-wait=2000
pafa.cloud.multi-datasource.sh.max-active=50
pafa.cloud.multi-datasource.sh.test-on-borrow=true
pafa.cloud.multi-datasource.sh.initial-size=10
pafa.cloud.multi-datasource.sh.idle-timeout=60000
pafa.cloud.multi-datasource.sh.connection-timeout=6000
pafa.cloud.multi-datasource.sh.auto-commit=false
pafa.cloud.multi-datasource.sh.transaction.auto_assemble.enabled=true
pafa.cloud.multi-datasource.sh.mybatis.auto_assemble.enabled=true
pafa.cloud.multi-datasource.sh.mybatis.mapperLocations=classpath:mapper/sh/*.xml</code></pre>
</div><table class="table" id="Multiple_data_sources__table_bht_pmg_bsb"><caption></caption><colgroup><col><col><col></colgroup><thead class="thead">
<tr class="row">
<th class="entry" id="Multiple_data_sources__table_bht_pmg_bsb__entry__1">配置项</th>
<th class="entry" id="Multiple_data_sources__table_bht_pmg_bsb__entry__2">说明</th>
<th class="entry" id="Multiple_data_sources__table_bht_pmg_bsb__entry__3">默认值</th>
</tr>
</thead><tbody class="tbody">
<tr class="row">
<td class="entry" headers="Multiple_data_sources__table_bht_pmg_bsb__entry__1 ">
<p class="p">pafa.cloud.multi-datasource.{数据源名称}.transaction.auto_assemble.enabled</p>
</td>
<td class="entry" headers="Multiple_data_sources__table_bht_pmg_bsb__entry__2 ">
<p class="p">是否开启事务,默认开启</p>
</td>
<td class="entry" headers="Multiple_data_sources__table_bht_pmg_bsb__entry__3 ">
<p class="p">true</p>
</td>
</tr>
<tr class="row">
<td class="entry" headers="Multiple_data_sources__table_bht_pmg_bsb__entry__1 ">
<p class="p">pafa.cloud.multi-datasource.{数据源名称}.mybatis.auto_assemble.enabled</p>
</td>
<td class="entry" headers="Multiple_data_sources__table_bht_pmg_bsb__entry__2 ">
<p class="p">是否开启框架加载mybaties,默认开启;业务如需定制mybaties,需设置为false</p>
</td>
<td class="entry" headers="Multiple_data_sources__table_bht_pmg_bsb__entry__3 ">
<p class="p">true</p>
</td>
</tr>
</tbody></table></li>
<li class="li"><strong class="ph b">mybaties加载</strong><ol class="ol" type="a" id="Multiple_data_sources__ol_p23_smg_bsb">
<li class="li">每个数据源对应一个sqlSessionTemplateRef ,约定方式:数据源名称+_SSF。</li>
<li class="li">若启用框架自动加载mybaties开发,需编写如下示例代码。<div class="p">
<pre class="pre codeblock" id="Multiple_data_sources__codeblock_bb4_5mg_bsb"><code>@Configuration
@MapperScan(basePackages = "com.pingan.pafa.cloud.jdbc.datasource.mapper.gz", sqlSessionTemplateRef = "gz_SSF")
public class GzMybatiesConfig {
}</code></pre>
</div></li>
<li class="li">若定制mybaties开发,需编写如下示例代码。<div class="p">
<pre class="pre codeblock" id="Multiple_data_sources__codeblock_gvr_ymg_bsb"><code>@Configuration
@MapperScan(basePackages = "com.pingan.pafa.cloud.jdbc.datasource.mapper.sh", sqlSessionTemplateRef = "sh_SSF")
public class ShMybatisConfig {
@Bean(name = "sh_SSF")
public SqlSessionTemplate testSqlSessionTemplate() throws Exception {
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(MultiDataSourceRegister.getMultiDataSources().get("sh"));
try {
String mapperLocations = "classpath:mapper/sh/*.xml";
sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(mapperLocations));
} catch (IOException e) {
e.printStackTrace();
}
return new SqlSessionTemplate(sqlSessionFactoryBean.getObject());
}
}</code></pre>
</div></li>
</ol></li>
<li class="li"><strong class="ph b">事务管理器规范</strong><p class="p">业务代码如需启用事务,事务管理器的书写约定为:数据源名称+_TM。</p><div class="p">
<pre class="pre codeblock" id="Multiple_data_sources__codeblock_vkz_1ng_bsb"><code>@Transactional(value = "sh_TM")
public void save() {
AccountInfo accountInfo = new AccountInfo();
accountInfo.setAccountName(UUID.randomUUID().toString());
accountInfo.setAccountPwd("pwd");
accountInfo.setAppKey(UUID.randomUUID().toString());
accountInfo.setAppSecret("appSecret");
accountInfo.setAccountType("00");
accountInfo.setStatus("00");
accountInfoMapper.insert(accountInfo);
}</code></pre>
</div></li>
</ol>
</section>
提交成功!非常感谢您的反馈,我们会继续努力做到更好!