【发布时间】: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 如下(我已删除所有 <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"/>
我可以看到日志行,因此肯定会调用自定义程序。但是,我没有看到数据库中设置的程序,当我浏览到 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