我的项目位于 spring-boot-starter-parent -“1.5.9.RELEASE”,我正在将其迁移到 spring-boot-starter-parent -“2.3.1.RELEASE”。
这是一种多租户环境应用程序,其中一个数据库将具有多个模式,并且根据租户 ID,在模式之间切换执行。
我已经使用以下方法实现了这种模式切换简单的 NativeJdbcExtractor但在最新的 Spring Boot 版本中NativeJdbcExtractor不再被提供。
现有实现的代码片段:
@Bean
@Scope(
value = ConfigurableBeanFactory.SCOPE_PROTOTYPE,
proxyMode = ScopedProxyMode.TARGET_CLASS)
public JdbcTemplate jdbcTemplate() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
SimpleNativeJdbcExtractor simpleNativeJdbcExtractor = new SimpleNativeJdbcExtractor() {
@Override
public Connection getNativeConnection(Connection con) throws SQLException {
LOGGER.debug("Set schema for getNativeConnection "+Utilities.getTenantId());
con.setSchema(Utilities.getTenantId());
return super.getNativeConnection(con);
}
@Override
public Connection getNativeConnectionFromStatement(Statement stmt) throws SQLException {
LOGGER.debug("Set schema for getNativeConnectionFromStatement "+Utilities.getTenantId());
Connection nativeConnectionFromStatement = super.getNativeConnectionFromStatement(stmt);
nativeConnectionFromStatement.setSchema(Utilities.getTenantId());
return nativeConnectionFromStatement;
}
};
simpleNativeJdbcExtractor.setNativeConnectionNecessaryForNativeStatements(true);
simpleNativeJdbcExtractor.setNativeConnectionNecessaryForNativePreparedStatements(true);
jdbcTemplate.setNativeJdbcExtractor(simpleNativeJdbcExtractor);
return jdbcTemplate;
}
这里 Utilities.getTenantId() (ThreadLocal 中的存储值)将根据 REST 请求给出架构名称。
问题:
- 有哪些替代方案NativeJdbcExtractor这样可以动态更改 JdbcTemplate 的架构吗?
- 有没有其他方法,在创建 JdbcTemplate bean 时我可以根据请求设置架构。
非常感谢任何解决此问题的帮助、代码片段或指导。
Thanks.
没有必要摆脱JdbcTemplate
. NativeJdbcExtractor
was 在 Spring Framework 5 中删除因为 JDBC 4 不需要它。
你应该更换你的使用NativeJdbcExtractor
并致电connection.unwrap(Class)
。该方法继承自Connection
来自 JDBC 的Wrapper.
您可能还想考虑使用AbstractRoutingDataSource其设计目的是根据查找键将连接请求路由到不同的底层数据源。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)