這篇文章給大家分享的是有關如何使用SpringBoot 配置Oracle和H2雙數據源的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
<!-- oracle --> <dependency> <groupId>com.github.noraui</groupId> <artifactId>noraui</artifactId> <version>2.4.0</version> </dependency> <!-- h3--> <dependency> <groupId>com.h3database</groupId> <artifactId>h3</artifactId> <version>1.4.197</version> </dependency> <!-- mybatisplus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.1</version> </dependency>
spring: http: encoding: charset: UTF-8 enabled: true force: true datasource: driver-class-name: org.h3.Driver schema: classpath:h3/schema-h3.sql data: classpath:h3/data-h3.sql jdbc-url: jdbc:h3:file:D:/Cache/IdeaWorkSpace/BigData/CustomerModel/src/main/resources/h3/data/h3_data username: root password: a123456 initialization-mode: always oracle: driver-class-name: oracle.jdbc.driver.OracleDriver jdbc-url: jdbc:oracle:thin:@xxx:1521:cmis username: xxx password: xxx h3: console: enabled: true path: /h3-console
可以看到配置中配置了兩個數據源,主數據源是H2,第二個數據源是Oracle,接下來是通過配置類來注入數據源
配置H2主數據源
package com.caxs.warn.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* @Author: TheBigBlue
* @Description:
* @Date: 2019/9/18
*/
@Configuration
@MapperScan(basePackages = "com.caxs.warn.mapper.h3", sqlSessionFactoryRef = "h3SqlSessionFactory")
public class H2DSConfig {
@Bean(name = "h3DataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "h3TransactionManager")
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(this.dataSource());
}
@Bean(name = "h3SqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("h3DataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sessionFactory.getObject();
}
@Bean(name = "h3Template")
public JdbcTemplate h3Template(@Qualifier("h3DataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}配置oracle從數據源
package com.caxs.warn.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* @Author: TheBigBlue
* @Description:
* @Date: 2019/9/18
*/
@Configuration
@MapperScan(basePackages = "com.caxs.warn.mapper.oracle",sqlSessionFactoryRef = "oracleSqlSessionFactory")
public class OracleDSConfig {
@Bean(name = "oracleDataSource")
@ConfigurationProperties(prefix = "spring.datasource.oracle")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "oracleTransactionManager")
public DataSourceTransactionManager transactionManager() {
return new DataSourceTransactionManager(this.dataSource());
}
@Bean(name = "oracleSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("oracleDataSource") DataSource dataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
return sessionFactory.getObject();
}
@Bean(name = "oracleTemplate")
public JdbcTemplate oracleTemplate(@Qualifier("oracleDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}Schema “classpath:h3/schema-h3.sql” not found
經過上面的配置就可以使用雙數據源了,但是當我們測試時會發現報如下錯誤:Schema “classpath:h3/schema-h3.sql” not found,這個問題我也是找了好久,因為在配置但數據源的時候沒有這個問題的,在配置多數據源才有了這個問題。
??
單數據源時,是直接SpringBoot自動配置DataSource的,這個時候是正常的,而當配置多數據源時,我們是通過@Configuration來配置數據源的,懷疑問題出在 DataSourceBuilder 創建數據源這個類上,而單數據源自動裝載時不會出現這樣的問題。然后百度搜了下這個DataSourceBuilder,看到文章中實例的配置中schema是這樣寫的:
package com.caxs.warn.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @Author: TheBigBlue
* @Description: 服務啟動后,初始化數據庫
* @Date: 2019/9/19
*/
@Component
public class ApplicationRunnerService implements ApplicationRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRunnerService.class);
@Autowired
@Qualifier("h3Template")
private JdbcTemplate h3Template;
@Value("${invoke.schema.location}")
private String schema;
@Value("${invoke.data.location}")
private String data;
/**
* @Author: TheBigBlue
* @Description: 項目啟動,執行sql文件初始化
* @Date: 2019/9/19
* @Param args:
* @Return:
**/
@Override
public void run(ApplicationArguments args) {
String schemaContent = this.getFileContent(schema);
String dataContent = this.getFileContent(data);
h3Template.execute(schemaContent);
h3Template.execute(dataContent);
}
/**
* @Author: TheBigBlue
* @Description: 獲取classpath下sql文件內容
* @Date: 2019/9/19
* @Param filePath:
* @Return:
**/
private String getFileContent(String filePath) {
BufferedReader bufferedReader = null;
String string;
StringBuilder data = new StringBuilder();
try {
ClassPathResource classPathResource = new ClassPathResource(filePath);
bufferedReader = new BufferedReader(new InputStreamReader(classPathResource.getInputStream()));
while ((string = bufferedReader.readLine()) != null) {
data.append(string);
}
} catch (IOException e) {
LOGGER.error("加載ClassPath資源失敗", e);
}finally {
if(null != bufferedReader){
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return data.toString();
}
}
??
抱著嘗試的態度改了下,發現果然沒問題了??!原來是在SpringBoot2.0之后schema對應的DataSourceProperties類中schema屬性是一個List,所以需要前面加 - (yml中加-映射集合),記錄下防止后面再踩坑。


Table “USER” not found; SQL statement:
??
這個問題也是在只有配置多數據源時才會碰到的問題,就是配置的spring.datasource.schema和spring.datasource.data無效。這個我看了下如果是配置單數據源,springboot自動加載Datasource,是沒問題的,但是現在是我們自己維護的datasource: return DataSourceBuilder.create().build();所以感覺還是DataSourceBuilder在加載數據源的時候的問題,但是還是沒有找到原因。有網友說必須加initialization-mode: ALWAYS這個配置,但是我配置后也是不能用的。
??
最后沒辦法就配置了一個類,在springboot啟動后,自己加載文件,讀取其中的sql內容,然后用jdbcTemplate去執行了下,模擬了下初始化的操作。。。后面如果有時間再來解決這個問題。
package com.caxs.warn.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.io.ClassPathResource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* @Author: TheBigBlue
* @Description: 服務啟動后,初始化數據庫
* @Date: 2019/9/19
*/
@Component
public class ApplicationRunnerService implements ApplicationRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRunnerService.class);
@Autowired
@Qualifier("h3Template")
private JdbcTemplate h3Template;
@Value("${invoke.schema.location}")
private String schema;
@Value("${invoke.data.location}")
private String data;
/**
* @Author: TheBigBlue
* @Description: 項目啟動,執行sql文件初始化
* @Date: 2019/9/19
* @Param args:
* @Return:
**/
@Override
public void run(ApplicationArguments args) {
String schemaContent = this.getFileContent(schema);
String dataContent = this.getFileContent(data);
h3Template.execute(schemaContent);
h3Template.execute(dataContent);
}
/**
* @Author: TheBigBlue
* @Description: 獲取classpath下sql文件內容
* @Date: 2019/9/19
* @Param filePath:
* @Return:
**/
private String getFileContent(String filePath) {
BufferedReader bufferedReader = null;
String string;
StringBuilder data = new StringBuilder();
try {
ClassPathResource classPathResource = new ClassPathResource(filePath);
bufferedReader = new BufferedReader(new InputStreamReader(classPathResource.getInputStream()));
while ((string = bufferedReader.readLine()) != null) {
data.append(string);
}
} catch (IOException e) {
LOGGER.error("加載ClassPath資源失敗", e);
}finally {
if(null != bufferedReader){
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return data.toString();
}
}感謝各位的閱讀!關于“如何使用SpringBoot 配置Oracle和H2雙數據源”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。