如何解决每个请求的 Jooq 配置
我正在努力寻找一种方法来在每个请求的 DSLContext 中定义一些设置。
我想要实现的目标如下:
我有一个 springboot API 和一个具有多个架构共享相同结构的数据库。 根据每个请求的一些参数,我想连接到一个特定的模式,如果没有设置参数,我想连接到任何模式并失败。
为了不连接到任何架构,我写了以下内容:
@Autowired
public DefaultConfiguration defaultConfiguration;
@PostConstruct
public void init() {
Settings currentSettings = defaultConfiguration.settings();
Settings newSettings = currentSettings.withRenderSchema(false);
defaultConfiguration.setSettings(newSettings);
}
我认为效果很好。
现在我需要一种方法来为每个请求在 DSLContext 中设置架构,所以每次我在请求期间使用 DSLContext 时,我都会自动获得与该架构的连接,而不会影响其他请求。 我的想法是拦截请求,获取参数并执行诸如“DSLContext.setSchema()”之类的操作,但其方式适用于当前请求期间对 DSLContext 的所有使用。
我尝试如下定义自定义 ConnectionProvider 的请求 scopeBean:
@Component
@RequestScope
public class ScopeConnectionProvider implements ConnectionProvider {
@Override
public Connection acquire() throws DataAccessException {
try {
Connection connection = dataSource.getConnection();
String schemaName = getSchemaFromRequestContext();
connection.setSchema(schemaName);
return connection;
} catch (SQLException e) {
throw new DataAccessException("Error getting connection from data source " + dataSource,e);
}
}
@Override
public void release(Connection connection) throws DataAccessException {
try {
connection.setSchema(null);
connection.close();
} catch (SQLException e) {
throw new DataAccessException("Error closing connection " + connection,e);
}
}
}
但此代码仅在第一个请求时执行。后续请求不执行此代码,因此它使用第一个请求的架构。
关于如何做到这一点的任何提示?
谢谢
解决方法
似乎您的请求范围 bean 被注入到单例中。
您已经在使用 @RequestScope
,这很好,但您可能忘记在 Spring 配置类中添加 @EnableAspectJAutoProxy
。
@Configuration
@EnableAspectJAutoProxy
class Config {
}
这将使您的 bean 在单例内部的代理中运行,因此会根据请求进行更改。
,没关系,我遇到的问题似乎是由我定义的某些可缓存函数的意外行为引起的。尽管输入不同,但该函数正在从缓存中返回一个值,这就是没有获取新连接的原因。我仍然需要弄清楚是什么导致了这种意外行为的想法。
现在,我会坚持使用这种方法,因为它在概念层面上看起来不错,但我希望有更好的方法来做到这一点。
*** 更新 *** 我发现这是我的缓存问题 Does java spring caching break reflection?
*** 更新 2 *** 似乎忽略了底层数据源中的设置架构。我目前正在尝试我刚刚发现的其他方法 (https://github.com/LinkedList/spring-jooq-multitenancy)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。