Spring R2DBC多数据源与Spring Boot



我创建了一个连接到两个模式(例如fo_pgdb, if_pgdb)的服务。我的问题是,当服务在if_pgdb模式中查询表时,它看起来好像是在fo_pgdb模式中查询表。我已经检查并硬编码了两个类属性中的数据库url(如下面的代码示例所示),看起来很好。有什么问题吗?

的例子:查询fo_pgdb模式下的表是"select * from bid_lines where bidlinseqnumber in(123, 345)返回结果集。因为id 123和345在表中有记录。

查询if_pgdb模式下的表是"select * from bid_lines where bidlinseqnumber in(567, 8910)返回空结果集但是id 567和8910这些id的记录在表中

test:当我在if_pgdb模式的表上查询中使用id 123和345时,我得到了fo_pgdb表中表中的相同记录。这是不应该发生的。

@Configuration
@EnableR2dbcRepositories(entityOperationsRef = "foEntityTemplate", basePackages = "com.r2dbc.poc.repository")
public class FODatabaseConfig {
//@Value("${spring.r2dbc.fo.connection.url}")
private String url = "r2dbc:postgresql://username:password@database-dev-fo-css-rr-db.corp.com:1200/fo_pgdb";
@Bean
@Qualifier("foConnectionFactory")
public ConnectionFactory foConnectionFactory() {
return ConnectionFactories.get(url);
}
@Bean
public R2dbcEntityOperations foEntityTemplate(@Qualifier("foConnectionFactory") ConnectionFactory connectionFactory) {
DefaultReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE);
DatabaseClient databaseClient = DatabaseClient.builder()
.connectionFactory(connectionFactory)
.bindMarkers(PostgresDialect.INSTANCE.getBindMarkersFactory())
.build();
return new R2dbcEntityTemplate(databaseClient, strategy);
}

}
@Configuration
@EnableR2dbcRepositories(entityOperationsRef = "ifEntityTemplate")
public class IFDatabaseConfig {

//@Value("${spring.r2dbc.if.connection.url}")
private String url = "r2dbc:postgresql://username:password@database-blue-if-CSS-db.corp.com:1200/if_pgdb";
@Bean
@Qualifier("ifConnectionFactory")
public ConnectionFactory ifConnectionFactory() {
return ConnectionFactories.get(url);
}
@Bean
public R2dbcEntityOperations ifEntityTemplate(@Qualifier("ifConnectionFactory") ConnectionFactory connectionFactory) {
DefaultReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE);
DatabaseClient databaseClient = DatabaseClient.builder()
.connectionFactory(connectionFactory)
.bindMarkers(PostgresDialect.INSTANCE.getBindMarkersFactory())
.build();
return new R2dbcEntityTemplate(databaseClient, strategy);
}
}
@Service
@RequiredArgsConstructor
public class CrewMemberSchedulePeriodPaymentService {
private final FOCrewMemberBidLineRepository foCrewMemberBidlineRepository;
private final IFCrewMemberBidLineRepository ifCrewMemberBidLineRepository;
public Flux<FOCrewMemberBidLine> getFOBidLines(List<Long> id) {
return foCrewMemberBidlineRepository.findAllById(id);
}
public Flux<IFCrewMemberBidLine> getIFBidLines(List<Long> id) {
return ifCrewMemberBidLineRepository.findAllById(id);
}
}
@Repository
public interface FOCrewMemberBidLineRepository extends R2dbcRepository<FOCrewMemberBidLine, Long> {
@Override
Flux<FOCrewMemberBidLine> findAllById(Iterable<Long> longs);
}

@Repository
public interface IFCrewMemberBidLineRepository extends R2dbcRepository<IFCrewMemberBidLine, Long> {
@Override
Flux<IFCrewMemberBidLine> findAllById(Iterable<Long> longs);
}
@Table(value = "BID_LINES")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class FOCrewMemberBidLine {
@Id
@Column(value = "bidlinseqnumber")
private Long bidlinseqnumber;
@Column(value = "bidlinschedperiod")
private String bidlinschedperiod;
}
@Table(value = "BID_LINES")
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class IFCrewMemberBidLine {
@Id
@Column(value = "bidlinseqnumber")
private Long bidlinseqnumber;
@Column(value = "bidlinschedperiod")
private String bidlinschedperiod;
}

也许您可以添加调用该方法的连接工厂,如下所示:

@Bean
@Qualifier("foConnectionFactory")
public ConnectionFactory foConnectionFactory() {
return ConnectionFactories.get("r2dbc:postgresql://username:password@database-dev-fo-css-rr-db.corp.com:1200/fo_pgdb");
}
@Bean
@Qualifier("ifConnectionFactory")
public ConnectionFactory ifConnectionFactory() {
return ConnectionFactories.get("r2dbc:postgresql://username:password@database-blue-if-CSS-db.corp.com:1200/if_pgdb");
}

@Bean
public R2dbcEntityOperations ifEntityTemplate() {
DefaultReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE);
DatabaseClient databaseClient = DatabaseClient.builder()
.connectionFactory(ifConnectionFactory()) //<-- change
.bindMarkers(PostgresDialect.INSTANCE.getBindMarkersFactory())
.build();
return new R2dbcEntityTemplate(databaseClient, strategy);
}
@Bean
public R2dbcEntityOperations foEntityTemplate() {
DefaultReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE);
DatabaseClient databaseClient = DatabaseClient.builder()
.connectionFactory(foConnectionFactory()) //<-- change
.bindMarkers(PostgresDialect.INSTANCE.getBindMarkersFactory())
.build();
return new R2dbcEntityTemplate(databaseClient, strategy);
}

您可以将所有bean放在同一个类中,并且每个bean都将使用所需的连接工厂创建。

欢呼。

最新更新