3

我想为来自 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 命令?

4

1 回答 1

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;");
  }
于 2013-02-27T15:23:19.440 回答