在我的Web应用程序中,我正在使用Hibernate在Oracle数据库中调用存储过程。
应用程序作为一个模式连接,并设置客户端标识符以确定哪个用户发出了请求。存储过程会像这样更新客户端标识符
SYS.DBMS_SESSION.SET_IDENTIFIER('<userId>');
在每个HTTP请求之前,请求处理线程将获得Hibernate会话并调用存储过程,如下所示:
String SET_CONTEXT_SQL = "call my_stored_proc(:userId)";
SQLQuery query = session.createSQLQuery(SET_CONTEXT_SQL);
query.setParameter("userId", userId);
query.executeUpdate();
请求后,它将清除标识符。
看来两个单独的线程,有两个不同的会话对象(我用session.hashCode()检查),将更新同一个数据库会话的CLIENT_IDENTIFER。
我可以在会话表中看到使用断点并在请求处理期间的不同时间检查会话表,如下所示:
SELECT SID, CLIENT_IDENTIFIER FROM v$session WHERE USERNAME='<schema>';
这是一个用户在另一个用户的请求处理完成之前发送请求的问题。
我一直很努力,我似乎无法找到造成这种行为的原因。有没有人有这样的事情发生过?有人可以解释Hibernate会话与数据库会话的关系吗?