对两个不同的模式使用相同的 jdbcTemplate
Using same jdbcTemplate for two different schemas
我有 2 个数据源,比如 dataSourceA
和 dataSourceB
,但是根据一些计算,我需要在不同的模式中执行相同的查询。此外,它将在任一模式中执行。
所以,在 DAO 层,我有一个 setDataSource()
方法,它是 @autowired
到 dataSourceA
,因此,返回具有以前数据源的 JDBCTemplate。我如何使用相同的 JDBCTemplate 实现 dataSourceB
更改,因为很难在每个 DAO 层进行更改,因为需要更改整个应用程序。
您能否根据您的逻辑将数据源和 select 数据源注入到您的方法中:
public class SomeDaoImpl implements SomeDao {
private final JdbcTemplate jdbcTemplateA;
private final JdbcTemplate jdbcTemplateB;
@Autowired
public SomeDaoImpl(JdbcTemplate jdbcTemplateA, JdbcTemplate jdbcTemplateB) {
// injecting both JdbcTemplate instances
this.jdbcTemplateA = jdbcTemplateA;
this.jdbcTemplateB = jdbcTemplateB;
}
public void businessLogicMethod(...) {
// choosing the actual template to be used according to your logic
JdbcTemplate jdbcTemplate = chooseTemplate(...);
// now using the template to execute a query
jdbcTemplate.execute(...);
}
}
另一种选择是实例化两个 SomeDaoImpl
实例并向每个实例注入一个 JdbcTemplate
,并 select 服务层中的 DAO 实例。
但这两种解决方案都有一个缺陷:事务通常在服务层发起(例如使用拦截器),并且它不知道您要将请求路由到另一个数据源;因此可能发生事务在一个数据源上启动,但查询在另一个数据源上执行。
因此,最明确的解决方案是向上一级并实例化 2 个服务,在每个 DAO 中具有不同的 JdbcTemplate
个实例。当然,必须配置和仔细连接 2 个事务管理器(例如,通过 @Transactional("transactionManagerA")
)。此处有更多信息 Spring - Is it possible to use multiple transaction managers in the same application?
我有 2 个数据源,比如 dataSourceA
和 dataSourceB
,但是根据一些计算,我需要在不同的模式中执行相同的查询。此外,它将在任一模式中执行。
所以,在 DAO 层,我有一个 setDataSource()
方法,它是 @autowired
到 dataSourceA
,因此,返回具有以前数据源的 JDBCTemplate。我如何使用相同的 JDBCTemplate 实现 dataSourceB
更改,因为很难在每个 DAO 层进行更改,因为需要更改整个应用程序。
您能否根据您的逻辑将数据源和 select 数据源注入到您的方法中:
public class SomeDaoImpl implements SomeDao {
private final JdbcTemplate jdbcTemplateA;
private final JdbcTemplate jdbcTemplateB;
@Autowired
public SomeDaoImpl(JdbcTemplate jdbcTemplateA, JdbcTemplate jdbcTemplateB) {
// injecting both JdbcTemplate instances
this.jdbcTemplateA = jdbcTemplateA;
this.jdbcTemplateB = jdbcTemplateB;
}
public void businessLogicMethod(...) {
// choosing the actual template to be used according to your logic
JdbcTemplate jdbcTemplate = chooseTemplate(...);
// now using the template to execute a query
jdbcTemplate.execute(...);
}
}
另一种选择是实例化两个 SomeDaoImpl
实例并向每个实例注入一个 JdbcTemplate
,并 select 服务层中的 DAO 实例。
但这两种解决方案都有一个缺陷:事务通常在服务层发起(例如使用拦截器),并且它不知道您要将请求路由到另一个数据源;因此可能发生事务在一个数据源上启动,但查询在另一个数据源上执行。
因此,最明确的解决方案是向上一级并实例化 2 个服务,在每个 DAO 中具有不同的 JdbcTemplate
个实例。当然,必须配置和仔细连接 2 个事务管理器(例如,通过 @Transactional("transactionManagerA")
)。此处有更多信息 Spring - Is it possible to use multiple transaction managers in the same application?