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

时间:2013-02-26 22:32:03

标签: java eclipselink

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

1 个答案:

答案 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;");
  }