我想为Eclipselink的每个会话设置一个数据库会话变量。我想要执行的SQL类似于:
begin DBMS_SESSION.SET_IDENTIFIER('MyApplicationName'); end;
如果我尝试创建一个将执行命令的SessionEvent侦听器,我似乎陷入无限递归。
myServer.getEventManager().addListener(new SessionEventAdapter() {
public void postConnect(SessionEvent evt) {
evt.getSession().executeNonSelectingCall(new SQLCall("begin DBMS_SESSION.SET_IDENTIFIER('MyApplicationName'); end;"));
}
});
我是否以错误的方式使用事件监听器,或者SQL命令是否需要以特殊方式执行?
答案 0 :(得分:5)
您正在为会话执行查询,同时仍在为某个其他进程获取连接。触发postConnect事件的连接在会话结束之前对会话不可用 - 这意味着会话中的任何查询都将被强制获取不同的连接。
您需要使用SessionEvent中的访问器来获取连接并使用它来直接执行JDBC语句。像
这样的东西 public void postConnect(SessionEvent evt) {
Connection connection = ((Accessor)event.getResult()).getConnection()
Statement statement = connection.createStatement();
statement.execute("begin DBMS_SESSION.SET_IDENTIFIER('MyApplicationName'); end;");
}