【问题标题】:Setting V$SESSION.program property on Glassfish JDBC Connection Pool在 Glassfish JDBC 连接池上设置 V$SESSION.program 属性
【发布时间】:2011-08-24 02:10:51
【问题描述】:

我的 Java EE 应用程序部署在 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->Additional Properties 我可以看到适当设置的 V$SESSION.program 条目。

但是,当我在 Oracle 数据库中查询连接 (SELECT * FROM V$SESSION) 时,它们具有与以前相同的 V$SESSION.program(即“JDBC 瘦客户端”),而不是我在域中设置的那个.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 如下(我已删除所有 &lt;class&gt;...&lt;/class&gt; 行):

<?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"/>

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

再次,非常欢迎任何更多建议,因为我不知所措!

【问题讨论】:

  • 您是否尝试过设置属性 V$SESSION.program 或 V$SESSION.PROGRAM?这只是一个猜测......
  • @vkraemer - 我目前正在使用 v$session.program(全部小写,包括表名)。我也尝试过 V$SESSION.PROGRAM 和 V$SESSION.program - 虽然都没有工作...我也尝试在 EntityManager 上设置 V$SESSION.program 属性,但这没有用(我没有我真的不期望它,因为据我了解,EntityManager 属性仅与 JPA 层有关,而不是与数据库的底层连接有关-但我出于绝望而尝试了一些东西...)
  • 我还发现了一个类似的帖子link,它以编程方式设置参数 - 我更喜欢在 domain.xml 中执行此操作,但我明天会尝试这种方法。
  • 还有一些想法。一,管理控制台不会显示来自数据库服务器的数据......它显示的是 domain.xml 中的数据。这也可能是驱动程序问题。您使用的是哪个版本的驱动程序?或者特权问题...

标签: oracle jpa jdbc glassfish eclipselink


【解决方案1】:

我终于找到了如何在 WebSphere 8 中为 XA 数据源设置此连接属性。可以在 WebSphere 管理控制台中设置: 资源 > JDBC 提供程序 > [Oracle JDBC 驱动程序 (XA)] > 数据源 > [数据源名称] > 自定义属性

只需添加一个带有键的属性:connectionProperties 及其值:v$session.program:PUT_YOUR_NAME_HERE

【讨论】:

  • 此处还记录了用于定义多个属性的替代语法:www-01.ibm.com/support/docview.wss?uid=swg21197705
  • 好的,谢谢。简而言之:您可以添加多个以分号分隔的参数。键:connectionProperties 值:propertyA=valueA;propertyB=valueB
【解决方案2】:

这适用于我使用 Spring。它也应该适用于您的 Java EE 应用程序。这个想法是通过传递给 connectionProperties 属性的属性间接设置 v$session 参数

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2015-11-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多