宅男在线永久免费观看网直播,亚洲欧洲日产国码无码久久99,野花社区在线观看视频,亚洲人交乣女bbw,一本一本久久a久久精品综合不卡

全部
常見問題
產(chǎn)品動態(tài)
精選推薦

JdbcTemplate的多數(shù)據(jù)源配置

管理 管理 編輯 刪除

在之前的分享中,我們介紹了如何使用目前最常用的三種數(shù)據(jù)訪問方式:

下面我們將分三篇來介紹在這三種數(shù)據(jù)訪問方式之下,當(dāng)我們需要多個(gè)數(shù)據(jù)源的時(shí)候,該如何使用的配置說明。

添加多數(shù)據(jù)源的配置

先在Spring Boot的配置文件application.properties中設(shè)置兩個(gè)你要鏈接的數(shù)據(jù)庫配置,比如這樣:

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/test1
spring.datasource.primary.username=root
spring.datasource.primary.password=123456
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/test2
spring.datasource.secondary.username=root
spring.datasource.secondary.password=123456
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

說明與注意

  1. 多數(shù)據(jù)源配置的時(shí)候,與單數(shù)據(jù)源不同點(diǎn)在于spring.datasource之后多設(shè)置一個(gè)數(shù)據(jù)源名稱primarysecondary來區(qū)分不同的數(shù)據(jù)源配置,這個(gè)前綴將在后續(xù)初始化數(shù)據(jù)源的時(shí)候用到。
  2. 數(shù)據(jù)源連接配置2.x和1.x的配置項(xiàng)是有區(qū)別的:2.x使用spring.datasource.secondary.jdbc-url,而1.x版本使用spring.datasource.secondary.url。如果你在配置的時(shí)候發(fā)生了這個(gè)報(bào)錯(cuò)java.lang.IllegalArgumentException: jdbcUrl is required with driverClassName.,那么就是這個(gè)配置項(xiàng)的問題。

初始化數(shù)據(jù)源與JdbcTemplate

完成多數(shù)據(jù)源的配置信息之后,就來創(chuàng)建個(gè)配置類來加載這些配置信息,初始化數(shù)據(jù)源,以及初始化每個(gè)數(shù)據(jù)源要用的JdbcTemplate。你只需要在你的Spring Boot應(yīng)用下添加下面的這個(gè)配置類即可完成!

@Configuration
public class DataSourceConfiguration {

    @Primary
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource secondaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
        return new JdbcTemplate(primaryDataSource);
    }

    @Bean
    public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
        return new JdbcTemplate(secondaryDataSource);
    }

}

說明與注意

  1. 前兩個(gè)Bean是數(shù)據(jù)源的創(chuàng)建,通過@ConfigurationProperties可以知道這兩個(gè)數(shù)據(jù)源分別加載了spring.datasource.primary.*spring.datasource.secondary.*的配置。
  2. @Primary注解指定了主數(shù)據(jù)源,就是當(dāng)我們不特別指定哪個(gè)數(shù)據(jù)源的時(shí)候,就會使用這個(gè)Bean
  3. 后兩個(gè)Bean是每個(gè)數(shù)據(jù)源對應(yīng)的JdbcTemplate。可以看到這兩個(gè)JdbcTemplate創(chuàng)建的時(shí)候,分別注入了primaryDataSource數(shù)據(jù)源和secondaryDataSource數(shù)據(jù)源

測試一下

完成了上面之后,我們就可以寫個(gè)測試類來嘗試一下上面的多數(shù)據(jù)源配置是否正確了,比如下面這樣:

@RunWith(SpringRunner.class)
@SpringBootTest
public class Chapter37ApplicationTests {

    @Autowired
    protected JdbcTemplate primaryJdbcTemplate;

    @Autowired
    protected JdbcTemplate secondaryJdbcTemplate;

    @Before
    public void setUp() {
        primaryJdbcTemplate.update("DELETE  FROM  USER ");
        secondaryJdbcTemplate.update("DELETE  FROM  USER ");
    }

    @Test
    public void test() throws Exception {
        // 往第一個(gè)數(shù)據(jù)源中插入 2 條數(shù)據(jù)
        primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "aaa", 20);
        primaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "bbb", 30);

        // 往第二個(gè)數(shù)據(jù)源中插入 1 條數(shù)據(jù),若插入的是第一個(gè)數(shù)據(jù)源,則會主鍵沖突報(bào)錯(cuò)
        secondaryJdbcTemplate.update("insert into user(name,age) values(?, ?)", "ccc", 20);

        // 查一下第一個(gè)數(shù)據(jù)源中是否有 2 條數(shù)據(jù),驗(yàn)證插入是否成功
        Assert.assertEquals("2", primaryJdbcTemplate.queryForObject("select count(1) from user", String.class));

        // 查一下第一個(gè)數(shù)據(jù)源中是否有 1 條數(shù)據(jù),驗(yàn)證插入是否成功
        Assert.assertEquals("1", secondaryJdbcTemplate.queryForObject("select count(1) from user", String.class));
    }

}

說明與注意

  1. 可能這里你會問,有兩個(gè)JdbcTemplate,為什么不用@Qualifier指定?這里順帶說個(gè)小知識點(diǎn),當(dāng)我們不指定的時(shí)候,會采用參數(shù)的名字來查找Bean,存在的話就注入。
  2. 這兩個(gè)JdbcTemplate創(chuàng)建的時(shí)候,我們也沒指定名字,它們是如何匹配上的?這里也是一個(gè)小知識點(diǎn),當(dāng)我們創(chuàng)建Bean的時(shí)候,默認(rèn)會使用方法名稱來作為Bean的名稱,所以這里就對應(yīng)上了。大家不妨回頭看看兩個(gè)名稱是不是一致的?


注:本文轉(zhuǎn)載自“程序猿DD”,如有侵權(quán),請聯(lián)系刪除!

請登錄后查看

哈哈哈醬 最后編輯于2024-12-23 17:07:08

快捷回復(fù)
回復(fù)
回復(fù)
回復(fù)({{post_count}}) {{!is_user ? '我的回復(fù)' :'全部回復(fù)'}}
排序 默認(rèn)正序 回復(fù)倒序 點(diǎn)贊倒序

{{item.user_info.nickname ? item.user_info.nickname : item.user_name}} LV.{{ item.user_info.bbs_level }}

作者 管理員 企業(yè)

{{item.floor}}# 同步到gitee 已同步到gitee {{item.is_suggest == 1? '取消推薦': '推薦'}}
{{item.is_suggest == 1? '取消推薦': '推薦'}}
沙發(fā) 板凳 地板 {{item.floor}}#
{{item.user_info.title || '暫無簡介'}}
附件

{{itemf.name}}

{{item.created_at}}  {{item.ip_address}}
打賞
已打賞¥{{item.reward_price}}
{{item.like_count}}
{{item.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)

{{itemc.user_info.nickname}}

{{itemc.user_name}}

回復(fù) {{itemc.comment_user_info.nickname}}

附件

{{itemf.name}}

{{itemc.created_at}}
打賞
已打賞¥{{itemc.reward_price}}
{{itemc.like_count}}
{{itemc.showReply ? '取消回復(fù)' : '回復(fù)'}}
刪除
回復(fù)
回復(fù)
查看更多
打賞
已打賞¥{{reward_price}}
891
{{like_count}}
{{collect_count}}
添加回復(fù) ({{post_count}})

相關(guān)推薦

快速安全登錄

使用微信掃碼登錄
{{item.label}} 加精
{{item.label}} {{item.label}} 板塊推薦 常見問題 產(chǎn)品動態(tài) 精選推薦 首頁頭條 首頁動態(tài) 首頁推薦
取 消 確 定
回復(fù)
回復(fù)
問題:
問題自動獲取的帖子內(nèi)容,不準(zhǔn)確時(shí)需要手動修改. [獲取答案]
答案:
提交
bug 需求 取 消 確 定
打賞金額
當(dāng)前余額:¥{{rewardUserInfo.reward_price}}
{{item.price}}元
請輸入 0.1-{{reward_max_price}} 范圍內(nèi)的數(shù)值
打賞成功
¥{{price}}
完成 確認(rèn)打賞

微信登錄/注冊

切換手機(jī)號登錄

{{ bind_phone ? '綁定手機(jī)' : '手機(jī)登錄'}}

{{codeText}}
切換微信登錄/注冊
暫不綁定
CRMEB客服

CRMEB咨詢熱線 咨詢熱線

400-8888-794

微信掃碼咨詢

CRMEB開源商城下載 源碼下載 CRMEB幫助文檔 幫助文檔
返回頂部 返回頂部
CRMEB客服