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

我想为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命令是否需要以特殊方式执行?

您正在为会话执行查询,同时仍在为某个其他进程获取连接。 触发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;"); }