賞金將在 3 天后到期。此問題的答案有資格獲得 50聲望賞金。 java編程想引起更多關注這個問題:
希望其他人以前也遇到過同樣的問題,并且存在一個簡單快捷的解決方案。
我已經按照這個例子配置了 Spring JPA 來處理多個資料源。 Spring JPA – 多個資料庫
它按預期作業,但由于我想使用不同的資料源但使用相同的存盤庫,因此存在問題。當我嘗試在我的服務上使用“宣告式事務管理”并指定我將使用主要事務或輔助事務時,事務注釋會忽略它。所以在這種情況下,它使用的是第二個。但是,創建了兩個 bean“PlatformTransactionManager”,但是在“@Transactional”中使用時,我無法使事務與我指定的 bean 一起作業。因此,@Transactional 似乎忽略了 bean 名稱,因為它們具有相同的存盤庫。有什么辦法可以在我嘗試使用宣告性事務時使用它?正如我所看到的,它可以通程序式化事務管理來完成,但由于我只使用宣告性事務,因此更改服務上的整個代碼將花費我。
uj5u.com熱心網友回復:
在我們的例子中,我們還有兩個資料庫,都使用 JPA 和存盤庫。但是,它們確實使用不同的存盤庫,但我認為我們的方法也應該適用于您的情況。我們定義了一個EntityManagerFactory和一個TransactionManager每個資料庫。我無法確認這是否有效,但我相信它應該。
主要資料源:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = {"ch.sac.data.primary.repository"},
entityManagerFactoryRef = "entityManagerFactory",
transactionManagerRef = "transactionManager")
public class ImporterPrimaryDataSourceConfiguration {
@Primary
@Bean(name = "dataSourceProperties")
@ConfigurationProperties("spring.datasource")
public DataSourceProperties dataSourceProperties() {
return new DataSourceProperties();
}
@Primary
@Bean(name = "primaryDataSource")
public DataSource dataSource(final DataSourceProperties dataSourceProperties) {
return dataSourceProperties
.initializeDataSourceBuilder()
.type(HikariDataSource.class)
.build();
}
@Primary
@Bean
public Flyway primaryFlyway(
final DataSource dataSource,
@Value("${spring.flyway.locations}") final String[] flywayLocations,
@Value("${spring.flyway.validate-on-migrate:true}")
final boolean flywayValidateOnMigrate) {
final var flyway =
Flyway.configure()
.dataSource(dataSource)
.locations(flywayLocations)
.validateOnMigrate(flywayValidateOnMigrate)
.load();
flyway.migrate();
return flyway;
}
@Primary
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(
final EntityManagerFactoryBuilder entityManagerFactoryBuilder,
final DataSource dataSource) {
final var jpaProperties =
Map.ofEntries(
Map.entry(
"hibernate.dialect",
"org.hibernate.spatial.dialect.postgis.PostgisDialect"));
return entityManagerFactoryBuilder
.dataSource(dataSource)
.packages("ch.sac.model.primary.entity")
.persistenceUnit("dataSource")
.properties(jpaProperties)
.build();
}
@Primary
@Bean
public PlatformTransactionManager transactionManager(
final EntityManagerFactory entityManagerFactory) {
return new JpaTransactionManager(entityManagerFactory);
}
}
輔助資料源(SQLite 資料庫,在記憶體中創建,根據您的用例進行調整):
@Configuration
@EnableJpaRepositories(
basePackages = {"ch.sac.data.sqlite.repository"},
entityManagerFactoryRef = "sqliteEntityManagerFactory",
transactionManagerRef = "sqliteTransactionManager")
public class ImporterSQLiteDataSourceConfiguration {
@Bean(name = "sqliteDBFilePath")
public String sqliteDBFilePath() throws IOException {
return TempFileManager.createEmptyTempFile("metadata.sqlite").toString();
}
@Bean(name = "sqliteDataSourceProperties")
public DataSourceProperties sqliteDataSourceProperties() {
return new DataSourceProperties();
}
@Bean(name = "sqliteDataSource")
public DataSource sqliteDataSource(
@Qualifier("sqliteDataSourceProperties")
final DataSourceProperties sqliteDataSourceProperties,
final String sqliteDBFilePath) {
return sqliteDataSourceProperties
.initializeDataSourceBuilder()
.driverClassName("org.sqlite.JDBC")
.url("jdbc:sqlite:" sqliteDBFilePath)
.type(HikariDataSource.class)
.build();
}
@Bean
public Flyway sqliteFlyway(
@Qualifier("sqliteDataSource") final DataSource sqliteDataSource,
@Value("${sqlite.flyway.locations}") final String[] flywayLocations) {
final var flyway =
Flyway.configure().dataSource(sqliteDataSource).locations(flywayLocations).load();
flyway.migrate();
return flyway;
}
@Bean(name = "sqliteEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean sqliteEntityManagerFactory(
final EntityManagerFactoryBuilder sqliteEntityManagerFactoryBuilder,
@Qualifier("sqliteDataSource") final DataSource sqliteDataSource) {
final var sqliteJpaProperties =
Map.ofEntries(
Map.entry(
"hibernate.dialect", "org.sqlite.hibernate.dialect.SQLiteDialect"));
return sqliteEntityManagerFactoryBuilder
.dataSource(sqliteDataSource)
.packages("ch.sac.model.sqlite.entity")
.persistenceUnit("sqliteDataSource")
.properties(sqliteJpaProperties)
.build();
}
@Bean(name = "sqliteTransactionManager")
public PlatformTransactionManager sqliteTransactionManager(
@Qualifier("sqliteEntityManagerFactory")
final EntityManagerFactory sqliteEntityManagerFactory) {
return new JpaTransactionManager(sqliteEntityManagerFactory);
}
}
uj5u.com熱心網友回復:
找到了答案:可以通過擴展spring的AbstractRoutingDataSource類來實作。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/454158.html
上一篇:規范化PostgreSQL資料庫
下一篇:嘗試將SQL查詢轉換為JPA查詢
