Как изменить сеанс NLS_COMP/SORT после того, как выполняется чересстрочный запрос
Мой вопрос был специфическим для некоторого проблемного сценария, когда транзакция запускалась из Spring Container с помощью EntityManager
тогда я получаю спящий сеанс из EntityManager
,
Общий поток:
В приложении
entityManager.createNativeQuery(searchQuery)
там, чтобы выбрать некоторые данные.Мне нужно вывести сеанс гибернации из
entityManager
тогда в сеансе я хочу установитьnls_comp
/nls_sort
или я могу выполнить запрос вentityManager
сам. например, изменить набор сеансовnls_comp=linguistic
,После того, как это будет сделано, я хочу снова отключить эту опцию до прежнего состояния. Скорее всего, закрывая сеанс гибернации или какой-то механизм. Это правильный подход?
Должен ли я начать другую транзакцию для команды 2 alter (я попытался, но с некоторым исключением). Пожалуйста, дайте мне знать, как этого добиться и как управлять сеансом гибернации внутри транзакции, инициированной пружиной, или я могу добиться включения / выключения с помощью entityManager
сам.
1 ответ
Вот как вы можете это сделать:
org.hibernate.Session session = (Session) entityManager.getDelegate();
session.doWork(new Work() {
@Override
public void execute(Connection connection) throws SQLException {
PreparedStatement statement = null;
try {
statement = connection.createStatement();
statement.addBatch("ALTER SESSION SET NLS_COMP = LINGUISTIC");
statement.addBatch("ALTER SESSION SET NLS_SORT = SPANISH_M");
statement.executeBatch();
}
finally {
if(statement != null) {
statement.close();
}
}
}
});
- Вы можете получить Сессию от entityManager, используя getDelegate()
- Вы можете выполнить эти два оператора в текущем связанном соединении
- Изменения относятся только к текущему сеансу базы данных, и при закрытии соединения их следует восстановить до значений по умолчанию. Для пула соединений вы должны проверить, сохраняются ли они.
Вам не нужно вызывать session.close(), все будет учтено Spring автоматически при закрытии текущей транзакции. Редко приходится закрывать сессию вручную.
Если вы хотите выполнить логику для текущих настроек, лучше написать аспект AOP для выполнения 1. и 2. затем разрешить вызову выполнить только для сброса его обратно к предыдущим значениям в блоке finally. Вы можете определить свою собственную аннотацию, чтобы отметить все методы службы, для которых вы хотите включить эту логику. В любом случае Spring Pointcuts поддерживает выбор на основе аннотаций.