запрос, который будет выполняться перед каждым методом репозитория в том же коннекте? Задача состоит в том, чтобы инициализировать внутреннюю сессию в бд после получения каждого коннекта. Вот пример того, как это реализовано на js:
async function connect() {
if (!pool) {
log.error('Can`t connect to db, empty connection pool');
return false;
}
let conn;
let sql = "\
BEGIN \
MAIN.SWITCH_CONTEXT(\
vch_VC_CLN_SESSIONID => ':sessionId'\
);\
EXCEPTION\
WHEN ERRORS_PKG_S.SESSION_DOES_NOT_EXIST OR\
ERRORS_PKG_S.SESSION_CLOSED OR\
ERRORS_PKG_S.MULTIPLE_SESSIONS \
THEN \
MAIN.INIT( \
vch_VC_IP => '127.0.0.1', \
vch_VC_USER => ':user', \
vch_VC_PASS => ':password', \
vch_VC_APP_CODE => ':appCode', \
vch_VC_CLN_APPID => ':appID'\
);\
END;\
"
try {
conn = await pool.getConnection();
await conn.execute(bindParams(sql, sessionOptions));
} catch (error) {
log.error('Connect error', error);
conn = false;
}
return conn;
}
Аспект с поинткатом на все методы репозитория сделай
Я рассматривал этот вариант, но не уверен, что запрос будет выполняться в том же коннекте. Поправьте пожалуйста, если ошибаюсь.
В смысле? Про какой ты контекст?
Я без понятия что происходит под капотом описанной выше процедуры. К сожалению это проприетарное ПО с выставленными наружу пакетами процедур и представлениями в качестве API. Для корректного выполнения некоторых процедур они требуют дополнительную регистрацию каждого подключения из пула с помощью вышеописанной процедуры. На сколько я понимаю, под капотом спринг тоже использует пул подключений(hikari). Поэтому я не уверен, что аспект репозитория будет выполняться в том же коннекте, выбранном из пула.
В том же. Надо только разобраться когда тебе надо вызывать живу процедуру. Если на открытие коннекта - это не тривиально, надо действительно лезть в хикари. Если в начале транзакции - относительно просто, решить можно. Если перед каждым запросом - ещё проще, аспект на метод репозитория
Обсуждают сегодня