在EclipseLink中为每个连接设置DB Session级别参数?

Tom*_* W. 3 java eclipselink

我想为Eclipselink的每个会话设置一个数据库会话变量.我想要执行的SQL是这样的:

begin DBMS_SESSION.SET_IDENTIFIER('MyApplicationName'); end;
Run Code Online (Sandbox Code Playgroud)

如果我尝试创建一个将执行命令的SessionEvent侦听器,我似乎陷入无限递归.

myServer.getEventManager().addListener(new SessionEventAdapter() {
    public void postConnect(SessionEvent evt) {
        evt.getSession().executeNonSelectingCall(new SQLCall("begin DBMS_SESSION.SET_IDENTIFIER('MyApplicationName'); end;"));
    }
});
Run Code Online (Sandbox Code Playgroud)

我是否以错误的方式使用事件监听器或者SQL命令是否需要以特殊方式执行?

Chr*_*ris 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;");
  }
Run Code Online (Sandbox Code Playgroud)