Spring JdbcTemplate - как подготовить каждый запрос для достижения многопользовательского режима? - PullRequest
0 голосов
/ 27 сентября 2018

Настройка

У меня есть приложение, использующее Spring 4.3, JdbcTemplate, Hibernate 5 и MySQL 8. Я реализовал многопользовательский режим в режиме гибернации для каждой схемы, где я переключаю схемы, используя механизм многопользовательского режима Hibernates -MultiTenantConnectionProvider и делать там в основном:

connection.createStatement().execute("USE " + databaseNamePrefix + tenantIdentifier); 

и это работает.

Теперь в отчетной части моего приложения для запросов к БД используется JdbcTemplate.И теперь я хочу аналогичным образом перед каждым запросом, выполняемым JdbcTemplate, выдавать этот оператор USE tenantIdentifier.

Вопрос

Как я могу добавить какой-либо SQL или оператор к каждому запросу, выполняемому JdbcTemplate?

Что я пробовал

Я посмотрел на JdbcTemplate, и единственное, что я нашел, это установить NativeJdbcExtractor.Я попробовал приведенный ниже код, но он даже не регистрируется, что он использует эти методы.

@Bean
@DependsOn("dataSource")
public JdbcTemplate jdbcTemplate() {
  JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource());
  jdbcTemplate.setNativeJdbcExtractor(new SimpleNativeJdbcExtractor(){
     @Override
     public Connection getNativeConnection(Connection con) throws SQLException {
        LOGGER.info("getNativeConnection");
        System.out.println("aaa");
        return super.getNativeConnection(con);
     }

     @Override
     public Connection getNativeConnectionFromStatement(Statement stmt) throws SQLException {
        System.out.println("aaa");
        LOGGER.info("getNativeConnectionFromStatement");
        return super.getNativeConnectionFromStatement(stmt);
     }

  });
  return jdbcTemplate;
}

Добавлен запрос функции в Spring: https://jira.spring.io/browse/SPR-17342

РЕДАКТИРОВАТЬ: я посмотрел на Spring 5и они удалили JdbcExtractor, так что это определенно неправильный путь.

1 Ответ

0 голосов
/ 27 сентября 2018

Не будет простого способа сделать это с JdbcTemplate, так как некоторые методы очень универсальны, например, execute(ConnectionCallback<T> action) методы позволяют прямой доступ к java.sql.Connection объекту.

Было бы проще иметьотдельный bean-компонент DataSource для каждого арендатора и решить эту проблему с помощью квалифицированного автоматического подключения весной.

Наличие участника-арендатора java.sql.Connection позволит выполнить оператор USE tenantIdentifier при открытии нового подключения к базе данных (некоторые библиотеки пулов поддерживают это сразу).Как и Оператор MySQL USE docs , это можно сделать один раз за сеанс:

Оператор USE db_name указывает MySQL использовать базу данных db_name в качестве базы данных по умолчанию (текущей) для последующих операторов.База данных остается по умолчанию до конца сеанса или другого оператора USE.

...