SpringBoot多數(shù)據源配置方式以及報錯問題的解決
SpringBoot多數(shù)據源配置
前幾天,公司提了個需求,對一個項目進行二次開發(fā),在開發(fā)過程中,需要配置多數(shù)據源來進行數(shù)據庫的操作。
下面我將主鍵探索總結的配置流程和遇到的各種坑做以總結,希望能夠幫到遇到同樣問題的友友。
1.雙數(shù)據源配置
首先是數(shù)據源配置:application.yml文件,這里要注意的是單數(shù)據源下的數(shù)據庫路徑為url,多數(shù)據源下為jdbc-url
spring: #單數(shù)據源 datasource: driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/meeting?serverTimezone=UTC username: root password: 1111 # 多數(shù)據源 datasource: one: #數(shù)據源1的配置 driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/meeting?serverTimezone=UTC username: root password: 1111 two: #數(shù)據源2的配置 driver-class-name: com.mysql.cj.jdbc.Driver jdbc-url: jdbc:mysql://127.0.0.1:3306/xin-master?serverTimezone=UTC username: root password: 1111
注意點:當我們使用多數(shù)據源配置的時候,mybatis和plus的配置就不需要在.yml文件中配置了,下面就是關于數(shù)據源的一些其他config配置了。
2.當數(shù)據源配置好之后
就需要注意我們的項目結構了,由于是兩套數(shù)據源,所以對應的mapper和xml文件應當放在不同的包或者目錄下
將每個數(shù)據源對應的mapper接口,和*Mapper.xml文件分開放在不同的包下,保證在進行數(shù)據庫的裝配時,根據我們的不同包,對應好不同的數(shù)據源。
3.對不同的數(shù)據源進行不同的配置
數(shù)據源在配置時候要有主從之分,這里我的one數(shù)據源為主庫,他的配置如下,
代碼過程請仔細看,主庫和從庫配置略有不同
> “主庫配置如下”
@Configuration > 這里進行mapper接口路徑的掃描 @MapperScan(basePackages = "com.sbp.api.mapper.mapper1", sqlSessionTemplateRef = "db1SqlSessionTemplate") public class DataSourceOneConfig { > 這里是一個不同點,主庫要加"@Primary"注解 @Bean @ConfigurationProperties(prefix = "spring.datasource.one") @Primary public DataSource db1DataSource() { return DataSourceBuilder.create().build(); } > 這里是一個不同點,主庫要加"@Primary"注解 @Bean @Primary @Lazy //這個是懶加載的注解,根據自己項目需要看是否添加 public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(dataSource); //開啟駝峰 MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); > "這個方法的調用是指定當前數(shù)據源的mybatis的Xml文件的路徑" bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapping/mapper1/*.xml")); return bean.getObject(); } @Bean @Primary public DataSourceTransactionManager db1TransactionManager(@Qualifier("db1DataSource") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean @Primary @Lazy public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
從庫配置如下
和主庫配置基本相同,只不過主庫的每個Bean前要加"@Primary"注解,從庫不加。
@Configuration @MapperScan(basePackages = "com.sbp.api.mapper.mapper2", sqlSessionTemplateRef = "sqlSessionTemplate2") public class DataSourceTwoConfig { @Bean(name = "dataSource2") @ConfigurationProperties(prefix = "spring.datasource.two") public DataSource dataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "sqlSessionFactory2") public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception { MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean(); bean.setDataSource(dataSource); //開啟駝峰 MybatisConfiguration configuration = new MybatisConfiguration(); configuration.setMapUnderscoreToCamelCase(true); bean.setConfiguration(configuration); bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapping/mapper2/*.xml")); return bean.getObject(); } @Bean(name = "transactionManager2") public DataSourceTransactionManager transactionManager(@Qualifier("dataSource2") DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean(name = "sqlSessionTemplate2") public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory2") SqlSessionFactory sqlSessionFactory) throws Exception { return new SqlSessionTemplate(sqlSessionFactory); } }
將上面的內容配置好之后,基本就完成了雙數(shù)據源的配置,但是為了項目的健康運行,
還需要檢查下面的一些配置:
1.項目主啟動類是否添加了@MapperScan(“*”)注解
如果添加了,請將他去掉,因為我們的每個數(shù)據源在config配置類中都單獨指定了basePackages 掃描路徑。這里再添加上可能會報錯。因為我再測試過程中遇到了。
2.項目啟動后主庫訪問可能沒有問題
但是從庫訪問報:Invalid bound statement (not found):com…selectAll這種錯誤
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.hnchances.api.mapper.mapper2.ymssm.YmSsmMapper.insterPhone
網上解決辦法我找著都試了一遍,好多大佬都有遇到這種問題,提供的問題解決思路如下
通常導致這種原因的大致有以下這幾種情況
1、mapper的namespace 有問題
2、 xxMapper的方法在xxMapper.xml中沒有,調用那個方法就報錯
3、沒有正確配置ResultMap,或者只配置ResultType!等等。
當篩選完畢上邊這些配置都沒有問題,那么就要考慮是不是mybatis或者mybatis-plus自動加載了mapper,導致我們再配置類中手動配置的xml路徑失效,導致的 Invalid bound statement (not found)問題。
需要將二者的自動加載排除:在主啟動類中進行排除即可:
> "這里@SpringBootApplication中的語句就是排除二者的自動mapper加載,如果你的項目中只有其中一個依賴的話,就只需要排除一個就行," > "我的項目在之前開發(fā)時,他們兩個mybatis持久層框架都使用了,所以兩個都需要排除" @SpringBootApplication(exclude = {MybatisAutoConfiguration.class, MybatisPlusAutoConfiguration.class}) // 開啟定時任務 @EnableScheduling //@MapperScan("com.hnchances.api.mapper") //多數(shù)據源,這里不需要包掃描 @Import({DataSourceOneConfig.class, DataSourceTwoConfig.class}) public class ApiApplication { public static void main(String[] args) { SpringApplication.run(ApiApplication.class, args); } }
至此,spring boot多數(shù)據源配置和遇坑報錯問題基本都解決了。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MyBatis?Plus如何實現(xiàn)獲取自動生成主鍵值
這篇文章主要介紹了MyBatis?Plus如何實現(xiàn)獲取自動生成主鍵值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09Springboot視頻接口報大量的ClientAbortException找不到原因的解決
本文主要介紹了Springboot視頻接口報大量的ClientAbortException找不到原因的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-08-08Java Spring Boot實戰(zhàn)練習之單元測試篇
單元測試(unit testing),是指對軟件中的最小可測試單元進行檢查和驗證。對于單元測試中單元的含義,一般來說,要根據實際情況去判定其具體含義,如C語言中單元指一個函數(shù),Java里單元指一個類,圖形化的軟件中可以指一個窗口或一個菜單等2021-10-10SpringBoot讀取properties配置文件中的數(shù)據的三種方法
本文主要介紹了SpringBoot讀取properties配置文件中的數(shù)據的三種方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-06-06