一)spring boot + hibernate 多数据源(XML)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
@SpringBootApplication
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
@ComponentScan(basePackages = "com.opentrans.kit")
@ImportResource({ "classpath:META-INF/spring/applicationContext.xml" })
public class KitApplication extends SpringBootServletInitializer {
public static void main(String[] args) {
SpringApplication.run(KitApplication.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(KitApplication.class);
}
}
二) properties 配置
## DB properties:
spring.datasource.kit.url=jdbc:postgresql://localhost:5432/kit
spring.datasource.kit.username=jetty
spring.datasource.kit.password=jetty
spring.datasource.kit.driver-class-name=org.postgresql.Driver
spring.datasource.kit.initial-size=10
spring.datasource.kit.min-idle=10
spring.datasource.kit.max-active=100
## DB otmsxtt
spring.datasource.xtt.url=jdbc:postgresql://192.168.3.74:5432/otmsxtt2k
spring.datasource.xtt.username=jetty
spring.datasource.xtt.password=jetty
spring.datasource.xtt.driver-class-name=org.postgresql.Driver
spring.datasource.xtt.initial-size=5
spring.datasource.xtt.min-idle=10
spring.datasource.xtt.max-active=100
## JPA Configuration:
spring.jpa.show-sql=true
## Spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=none
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
## log4j
logging.config=classpath:log4j2.xml
三) 注解式数据源配置
1. 数据源配置类 DataSourceConfigration.java ,多数据源时必须指定一个数据源首选项注解@Primary(prefix对应properties数据库配置的前缀)
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfigration {
@Primary
@Bean(name = "dataSourceKit")
@ConfigurationProperties(prefix = "spring.datasource.kit")
public DataSource dataSourceKit() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSourceOtms")
@ConfigurationProperties(prefix = "spring.datasource.otms")
public DataSource dataSourceOtms() {
return DataSourceBuilder.create().build();
}
@Bean(name = "dataSourceXtt")
@ConfigurationProperties(prefix = "spring.datasource.xtt")
public DataSource dataSourceXtt() {
return DataSourceBuilder.create().build();
}
}
2. 数据库A的配置类 KitDefine.java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
import java.util.Map;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryKit",
transactionManagerRef = "transactionManagerKit",
basePackages = {"com.opentrans.kit.jpa.kit.repository" })
public class KitDefine {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("dataSourceKit")
private DataSource dataSourceKit;
@Primary
@Bean(name = "entityManagerFactoryKit")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryKit(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean em = builder.dataSource(dataSourceKit)
.properties(getVendorProperties(dataSourceKit))
.packages("com.opentrans.kit.jpa.kit.entity")
.persistenceUnit("kitPersistenceUnit").build();
return em;
}
@Primary
@Bean(name = "transactionManagerKit")
PlatformTransactionManager transactionManagerKit(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryKit(builder).getObject());
}
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
}
3. 数据库B配置类 OtmsXttDefine.java
import java.util.Map;
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactoryXtt",
transactionManagerRef = "transactionManagerXtt",
basePackages = {"com.opentrans.kit.jpa.xtt.repository" })
public class OtmsXttDefine {
@Autowired
private JpaProperties jpaProperties;
@Autowired
@Qualifier("dataSourceXtt")
private DataSource dataSourceXtt;
@Bean(name = "entityManagerFactoryXtt")
public LocalContainerEntityManagerFactoryBean entityManagerFactoryXtt(EntityManagerFactoryBuilder builder) {
LocalContainerEntityManagerFactoryBean em = builder.dataSource(dataSourceXtt)
.properties(getVendorProperties(dataSourceXtt))
.packages("com.opentrans.kit.jpa.xtt.entity")
.persistenceUnit("XttPersistenceUnit").build();
return em;
}
@Bean(name = "transactionManagerXtt")
PlatformTransactionManager transactionManagerXtt(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactoryXtt(builder).getObject());
}
private Map<String, String> getVendorProperties(DataSource dataSource) {
return jpaProperties.getHibernateProperties(dataSource);
}
}
四)pom.xml - maven
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.otms.field</groupId>
<artifactId>toolkit</artifactId>
<version>1.0-SNAPSHOT</version>
<name>toolkit</name>
<description>Team field engineering toolkit</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.1.RELEASE</version>
<relativePath/>
</parent>
<properties>
<postgres.version>8.4-702.jdbc4</postgres.version>
<fastjson.version>1.2.16</fastjson.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!-- <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpcore</artifactId>
<version>4.4.6</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgres.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>