如何在Hibernate/JPA中配置具有兩個連線池的兩個資料來源
這是展示一個SpringBoot應用程式,它使用兩個資料來源(兩個MySQL資料庫,一個命名players_db,一個命名coaches_db)和兩個連線池(每個資料庫使用自己的HikariCP連線池,具有不同的設定)。基於上述配置,從兩個不同的提供程式配置兩個連線池非常容易。
關鍵點:
1. 在pom.xml,新增spring-boot-configuration-processor依賴項
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies> |
2. 在application.properties,自定義兩個配置兩個HikariCP連線池,例如app.datasource.ds1和app.datasource.ds2
app.datasource.ds1.url=jdbc:mysql://localhost:3306/players_db?createDatabaseIfNotExist=true app.datasource.ds1.username=root app.datasource.ds1.password=root app.datasource.ds1.connection-timeout=50000 app.datasource.ds1.idle-timeout=300000 app.datasource.ds1.max-lifetime=900000 app.datasource.ds1.maximum-pool-size=8 app.datasource.ds1.minimum-idle=8 app.datasource.ds1.pool-name=MyPoolDS1 app.datasource.ds1.connection-test-query=select 1 from dual app.datasource.ds2.url=jdbc:mysql://localhost:3306/coaches_db?createDatabaseIfNotExist=true app.datasource.ds2.username=root app.datasource.ds2.password=root app.datasource.ds2.connection-timeout=50000 app.datasource.ds2.idle-timeout=300000 app.datasource.ds2.max-lifetime=900000 app.datasource.ds2.maximum-pool-size=4 app.datasource.ds2.minimum-idle=4 app.datasource.ds2.pool-name=MyPoolDS2 app.datasource.ds2.connection-test-query=select 1 from dual spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect logging.level.com.zaxxer.hikari.HikariConfig=DEBUG logging.level.com.zaxxer.hikari=TRACE spring.jpa.show-sql=true |
3. 寫一個@Bean返回第一個DataSource並將其標記為@Primary
寫另一個@Bean返回第二個DataSource
@Configuration public class ConfigureDataSources { @Bean(name = "c1") @Primary @ConfigurationProperties("app.datasource.ds1") public DataSourceProperties firstDataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "c2") @ConfigurationProperties("app.datasource.ds2") public DataSourceProperties secondDataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "ds1") @Primary @ConfigurationProperties("app.datasource.ds1") public HikariDataSource firstDataSource(@Qualifier("c1") DataSourceProperties properties) { return properties.initializeDataSourceBuilder().type(HikariDataSource.class) .build(); } @Bean(name = "ds2") @ConfigurationProperties("app.datasource.ds2") public HikariDataSource secondDataSource(@Qualifier("c2") DataSourceProperties properties) { return properties.initializeDataSourceBuilder().type(HikariDataSource.class) .build(); } } |
4. 配置兩個EntityManagerFactory並指出要掃描每個包的包
@Configuration @EnableJpaRepositories( entityManagerFactoryRef = "ds1EntityManagerFactory", transactionManagerRef = "ds1TransactionManager", basePackages = "com.jpa.ds1" ) @EnableTransactionManagement public class FirstEntityManagerFactory { @Bean @Primary public LocalContainerEntityManagerFactoryBean ds1EntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("ds1") DataSource dataSource) { return builder .dataSource(dataSource) .packages(packagesToScan()) .persistenceUnit("ds1-pu") .properties(singletonMap("hibernate.hbm2ddl.auto", "create")) .build(); } @Bean @Primary public PlatformTransactionManager ds1TransactionManager( @Qualifier("ds1EntityManagerFactory") EntityManagerFactory ds1EntityManagerFactory) { return new JpaTransactionManager(ds1EntityManagerFactory); } protected String[] packagesToScan() { return new String[]{ "com.jpa.ds1" }; } } |
4.將每個與EntityManager相關領域模型和儲存庫放在正確的包中:
ds1包目錄: Player.java PlyaerRepository.java PlayerService.java
ds2包目錄:Coach.java CoachRepository.java CoachService.java
原始碼可以在這裡找到
相關文章
- Spring系列 之資料來源的配置 資料庫 資料來源 連線池的區別Spring資料庫
- springboot新增多資料來源連線池並配置MybatisSpring BootMyBatis
- Unity如何在兩個編輯器中轉移資源Unity
- golang兩種資料庫連線池實現Golang資料庫
- AWS 兩個VPC相互連線
- 使用 jOOQ 連線兩個表
- 4、資料庫連線池的概念及C3P0、Uruid兩種連線池的使用資料庫UI
- Day39--連線兩個字串字串
- 資料庫連線 系列一:laravel框架如何連線兩個資料庫(不同伺服器)資料庫Laravel框架伺服器
- 【MySQL】自定義資料庫連線池和開源資料庫連線池的使用MySql資料庫
- druid資料庫連線池的配置類UI資料庫
- Spring系列之多個資料來源配置Spring
- mysql資料庫連線池配置教程MySql資料庫
- windows連線兩個音響同時播放Windows
- JPA配置mysql連線MySql
- SSL連線分為兩個階段:握手和資料傳輸階段
- 關聯線探究,如何連線流程圖的兩個節點流程圖
- Hibernate【查詢、連線池、逆向工程】
- Java中的多資料來源管理:如何在單個應用中整合多資料庫Java資料庫
- 使用select,兩個case 讀取 同一個chan 中的資料,兩個case都可能被執行到
- 2.6 Laravel配置多個資料庫連線Laravel資料庫
- 如何在SpringBoot中使用Hibernate/JPA的@NaturalId?Spring Boot
- 使用JPA連線資料庫資料庫
- 使用Spring Boot配置多個資料來源 - UdithSpring Boot
- 「資料庫、資料庫連線池、資料來源」這些概念你真的理解了嗎?資料庫
- 兩個有序連結串列序列的交集
- 交換兩個資料的三種方法
- Spring JPA資料庫連線MySQLSpring資料庫MySql
- Spring boot 如何快速的配置多個 Redis 資料來源Spring BootRedis
- django中的資料庫連線池實現Django資料庫
- 兩個連結串列的第一個公共結點
- 兩個連結串列的第一個公共節點
- 資料庫連線池-Druid資料庫連線池原始碼解析資料庫UI原始碼
- java比較mysql兩個資料庫中差異JavaMySql資料庫
- 如何在weka中連線資料庫資料庫
- python連線clickhouse資料庫的兩種方式小結Python資料庫
- 設計一個可靠的連線池
- 再來兩個小問題