Пользователи приложений в политиках на уровне строк: как установить переменные сеанса

Я пытаюсь написать политики на уровне строк, которые проверяют права пользователя перед выполнением запросов. В этом контексте мне нужно иметь возможность установить переменную сеанса, содержащую идентификатор пользователя, когда соединение извлекается из пула соединений, и сбросить / освободить ту же переменную сеанса, когда соединение возвращается в пул. Следующий блог может дать хорошее представление о том, что я пытаюсь сделать: 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 pool и give back to pool.

Я просматривал документацию по Hikari и Spring, но не нашел ничего полезного. Вероятно, это мой первый вопрос: предоставляют ли такие обратные вызовы Hikari и / или Spring?

Следующим шагом в моем исследовании был jOOQ. Наткнулся на ExecuteListener. Это мой дополнительный вопрос: ExecuteListener подойдет ли для этого ExecuteListener хорошее приложение? Это не реализует фактическую точку, когда соединение берется и возвращается, но execution context, вероятно, достаточно хорош в моем случае (поскольку все мои запросы выполняются в jOOQ)? Если да, следует ли мне реализовать функции start и end?


person Elisabeth Trons    schedule 09.08.2017    source источник


Ответы (1)


Это можно решить на разных уровнях вашего текущего стека. Вот два предложения:

Решение этой проблемы в DataSource / Connection прокси

Большинство пулов соединений реализуют следующую семантику:

Итак, вы можете проксировать эти два API и реализовать желаемую семантику внутри этих соответствующих методов. Это немного больше работы, но он будет работать с любым клиентом JDBC, включая jOOQ (т.е. он также будет работать, если вы не используете jOOQ)

Решение этой проблемы в jOOQ

Если все ваши взаимодействия с базой данных проходят через jOOQ, вы можете решить эту проблему напрямую с помощью jOOQ, используя _ 5_ SPI, который содержит два метода, которые имеют именно ту семантику, которая вам нужна:

Итак, вместо использования готового jOOQ 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, но описанный выше подход, безусловно, проще.

person Lukas Eder    schedule 11.08.2017
comment
Спасибо. Я не понимал, что функции take и give back - это просто две функции. Я либо проксирую их в DataSource, либо использую ConnectionProvider в jOOQ! - person Elisabeth Trons; 11.08.2017