在Glassfish JDBC连接池上设置V $ SESSION.program属性

时间:2011-05-12 12:25:30

标签: oracle jpa jdbc glassfish eclipselink

我的Java EE App部署在Glassfish 3.0.1上,并使用JDBC连接池连接到Oracle 9i数据库。我正在使用JPA读取/写入数据库的数据,这是正常的。但是,为了更好地报告此应用程序加载到数据库的负载,我想设置V $ SESSION.program列以供oracle使用。

从各种谷歌搜索(例如http://forums.oracle.com/forums/thread.jspa?messageID=3271623)看起来我应该只能将其添加为属性,就像设置任何其他属性一样。所以我通过更改Glassfish的domain.xml文件(见下文)尝试了这一点,当我使用Glassfish管理控制台查看它时,现在在JDBC连接池上设置了V $ SESSION.program属性(当我启动时glassfish服务器,转到管理页面并浏览到Resources-> JDBC-> Connection Pools-> MyConnectionPool->其他属性我可以看到适当设置V $ SESSION.program的条目。

但是,当我向Oracle数据库查询连接(SELECT * FROM V$SESSION)时,它们具有与以前相同的V $ SESSION.program(这是“JDBC瘦客户端”),而不是我设置的那个domain.xml,我可以在Glassfish管理页面上看到它作为JDBC连接池的属性。

我的domain.xml的资源部分如下:

<resources>
  <jdbc-connection-pool pool-resize-quantity="4" max-pool-size="16" datasource-classname="oracle.jdbc.pool.OracleDataSource" res-type="javax.sql.DataSource" steady-pool-size="4" name="mydatabasename">
    <property name="datasourceName" value="OracleConnectionPoolDataSource" />
    <property name="databaseName" value="mydatabasename" />
    <property name="password" value="mypassword" />
    <property name="portNumber" value="1521" />
    <property name="serverName" value="myservername" />
    <property name="url" value="jdbc:oracle:thin:@myservername:1521:mydatabasename" />
    <property name="user" value="myuser" />
    <property name="v$session.program" value="MyGlassfishApp" />
  </jdbc-connection-pool>
  <jdbc-resource pool-name="mydatabasename" jndi-name="jdbc/mydatabasename" />
</resources>

我的Persistence.xml如下(我删除了所有<class>...</class>行):

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

  <persistence-unit name="Persistence-ejb" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/mydatabasename</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.query.timeout" value="60"/>
      <property name="javax.persistence.lock.timeout" value="60"/>
      <property name="javax.persistence.target-server" value="SunAS9"/>

      <!-- Disable caching so we always use the DB directly -->
      <property name="eclipselink.cache.shared.default" value="false"/>
      <property name="eclipselink.query-results-cache" value="false"/>

    </properties>
  </persistence-unit>

</persistence>

修改 我已经尝试了v $ session.program,V $ SESSION.PROGRAM和V $ SESSION.program - 虽然没有工作......我也尝试在EntityManager上设置V $ SESSION.program属性,但这不起作用(我真的没想到它,因为从我的理解,EntityManager属性只与JPA层有关,而不是与数据库的底层连接 - 但我正在尝试绝望的东西......)

我还尝试使用建议here的SessionCustomizer。我使用的SessionCustomizer代码如下:

public class ProgramSessionCustomizer implements SessionCustomizer {
    private static Logger logger = Logger.getLogger(ProgramSessionCustomizer.class);

    @Override
    public void customize(Session s) throws Exception {
        logger.error("ProgramSessionCustomizer setting v$session.program");
        s.getDatasourceLogin().setProperty("v$session.program", "MYprogramTEST");
        logger.error("ProgramSessionCustomizer has set v$session.program");
    }
}

然后我通过添加属性

在persistence.xml中设置SessionCustomizer
<property name="eclipselink.session.customizer" value="persistence.config.ProgramSessionCustomizer"/>

我可以看到日志行,因此肯定会调用Customizer。但是,我没有看到数据库中设置的程序,当我浏览Glassfish管理控制台上的JDBC连接池属性时,我甚至看不到它(正如我上面所说,我确实看到了使用glassfish domain.xml设置属性)

同样,由于我不知所措,任何更多的建议都会受到欢迎!

1 个答案:

答案 0 :(得分:0)

这适用于我使用Spring。它也适用于您的Java EE应用程序。我们的想法是通过传递给 connectionProperties 属性

的属性间接设置 v $ session param
<bean class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
    <property name="URL" value="${configDb.url}"/>
    <property name="user" value="${configDb.user}"/>
    <property name="password" value ="${configDb.password}"/>
    <property name="connectionCachingEnabled" value="true"/>
    <property name="connectionProperties">
       <value>v$session.program:PUT_YOUR_NAME_HERE</value>
    </property>
</bean>