我正在尝试编写行级策略,在执行查询之前检查用户权限。在此上下文中,我需要能够在从连接池中获取连接时设置包含用户标识符的会话变量,并在将连接返回到池时取消设置/释放相同的会话变量。以下博客可能会给出一个很好的背景来解释我想要做的事情:https://blog.2ndquadrant.com/application-users-vs-row-level-security/
在我的设置中,我有以下图层:
HikariDataSource
TransactionAwareDataSourceProxy
(使用Hikari数据源),DataSourceTransactionManager
(使用Hikary数据源)DataSourceConnectionProvider
(使用Spring数据源),DefaultDSLContext
前两层仅限内部。也就是说,应用程序中的所有查询都是通过jOOQ完成的,即最后一层。
因此,我需要能够在连接take from pool
和give back to pool
上实现回调。
我一直在查看Hikari和Spring的文档,但找不到任何有用的东西。这可能是我的第一个问题:Hikari和/或Spring是否提供了这样的回调?
我调查的下一步是jOOQ。我偶然发现了ExecuteListener
。这是我的后续问题:ExecuteListener
会成为一个很好的应用吗?这不会实现连接和返回时的实际点,但execution context
在我的情况下可能已经足够好了(因为我的所有查询都是在jOOQ中完成的)?如果是,我应该实施start
和end
函数吗?
答案 0 :(得分:2)
这可以在当前堆栈的各个级别解决。以下是两条建议:
DataSource
/ Connection
代理大多数连接池实现以下语义:
DataSource.getConnection()
:“从泳池中取出”Connection.close()
:“回到游泳池”因此,您可以代理这两个API并在这些相关方法中实现所需的语义。这是一个更多的工作,但它将适用于任何JDBC客户端,包括jOOQ(即,当你不使用jOOQ它也将工作)
如果您的所有数据库交互都通过jOOQ,您可以使用ConnectionProvider
SPI直接使用jOOQ更轻松地解决此问题,ConnectionProvider.acquire()
包含两个具有您所需语义的方法:
因此,您可以这样做,而不是使用jOOQ开箱即用的https://github.com/kossnocorp/jquery.turbolinks/issues/56:
public class MyConnectionProvider implements ConnectionProvider {
// Configure spring to inject your data source here
@Autowire
DataSource ds;
@Override
public Connection acquire() {
try {
Connection c = ds.getConnection();
// Do your stuff here
return c;
}
catch (SQLException e) {
throw new DataAccessException("Something failed", e);
}
}
@Override
public void release(Connection c) {
try {
// Do your stuff here
c.close();
}
catch (SQLException e) {
throw new DataAccessException("Something failed", e);
}
}
}
您也可以使用ExecuteListener
执行此操作,但上述方法肯定更简单。