1

我正在尝试编写在执行查询之前检查用户权限的行级策略。在这种情况下,我需要能够在从连接池中获取连接时设置一个包含用户标识符的会话变量,并在将连接返回池时取消设置/释放相同的会话变量。以下博客可能会提供一个很好的背景来解释我正在尝试做的事情:https ://blog.2ndquadrant.com/application-users-vs-row-level-security/

在我的设置中,我有以下层:

  1. 光:HikariDataSource
  2. Spring:(TransactionAwareDataSourceProxy使用Hikari数据源),DataSourceTransactionManager(使用Hikari数据源)
  3. jOOQ:(DataSourceConnectionProvider使用 Spring 数据源),DefaultDSLContext

前两层仅供内部使用。也就是说,应用程序中的所有查询都是通过最后一层 jOOQ 完成的。

所以,我需要能够在连接take from poolgive back to pool.

我一直在查看 Hikari 和 Spring 的文档,但找不到任何有用的东西。这可能是我的第一个问题:Hikari 和/或 Spring 是否提供这样的回调?

我调查的下一步是 jOOQ。我偶然发现ExecuteListener。这是我的后续问题:这会ExecuteListener是一个很好的应用程序吗?这并没有实现连接被取回并返回的实际点,但execution context在我的情况下可能已经足够好了(因为我所有的查询都是在 jOOQ 中完成的)?如果是这样,我应该实现startandend功能吗?

4

1 回答 1

3

这可以在您当前堆栈的各个级别上解决。这里有两个建议:

DataSource在/Connection代理中解决这个问题

大多数连接池实现以下语义:

因此,您可以代理这两个 API 并在这些相关方法中实现所需的语义。这需要更多的工作,但它适用于任何 JDBC 客户端,包括 jOOQ(即,当您不使用 jOOQ 时它也可以工作)

在 jOOQ 中解决这个问题

如果您所有的数据库交互都通过 jOOQ,您可以使用ConnectionProviderSPI直接使用 jOOQ 更轻松地解决这个问题,它包含两个具有您需要的语义的方法:

因此,您可以这样做,而不是使用 jOOQ 的 out-of-the-box DataSourceConnectionProvider

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,但上述方法肯定更简单。

于 2017-08-11T06:44:47.490 回答