我的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设置属性)
同样,由于我不知所措,任何更多的建议都会受到欢迎!
答案 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>