Установка свойства V $ SESSION.program в пуле соединений Glassfish JDBC - PullRequest
0 голосов
/ 12 мая 2011

мое приложение Java EE развернуто на Glassfish 3.0.1 и использует пул соединений JDBC для подключения к базе данных Oracle 9i. Я использую JPA для чтения / записи данных в базу данных, которая работает нормально. Тем не менее, чтобы получить более точные отчеты о нагрузке, которую приложение прикладывает к базе данных, я хочу установить столбец V $ SESSION.program для использования oracle.

Из различных поисков в Google (например, http://forums.oracle.com/forums/thread.jspa?messageID=3271623) похоже, я должен просто добавить это как свойство, так же, как вы задали бы любое другое свойство. Поэтому я попытался сделать это, изменив домен XML-файл для Glassfish (см. ниже), а свойство V $ SESSION.program теперь устанавливается в пуле соединений JDBC, когда я просматриваю его с помощью консоли администратора Glassfish (Когда я запускаю сервер glassfish, перейдите на страницу администратора и перейдите в раздел Ресурсы-> JDBC-> Пулы соединений-> MyConnectionPool-> Дополнительные свойства. Я вижу запись для V $ SESSION.program, установленную соответствующим образом).

Однако, когда я запрашиваю соединения с базой данных Oracle (SELECT * FROM V$SESSION), они имеют ту же V $ SESSION.program, что и раньше (то есть «Тонкий клиент JDBC»), а не ту, которую я установил в домене. .xml и который я вижу в качестве свойства пула соединений JDBC на странице администрирования Glassfish.

Раздел ресурсов моего 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>

EDIT: Я пробовал v $ session.program, V $ SESSION.PROGRAM и V $ SESSION.program - хотя никто не работал ... Я также пытался установить свойство V $ SESSION.program в EntityManager, но это не сработало (Я на самом деле не ожидал этого, поскольку, насколько я понимаю, свойства EntityManager связаны только со слоем JPA, а не с основным подключением к базе данных - но я пытаюсь что-то из отчаяния ...)

Я также пытался использовать 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");
    }
}

Затем я установил SessionCustomizer в файле persistence.xml, добавив свойство:

<property name="eclipselink.session.customizer" value="persistence.config.ProgramSessionCustomizer"/>

Я вижу строки журнала, поэтому определенно вызывается Настройщик. Однако я не вижу программу, установленную в базе данных, и даже не вижу ее установленной, когда просматриваю свойства пула соединений JDBC на консоли администратора Glassfish (которую, как я уже говорил выше, я вижу, когда установить свойство с помощью glassfish domain.xml)

Опять же, любые предложения будут приветствоваться, так как я в растерянности!

Ответы [ 2 ]

1 голос
/ 15 июля 2015

Наконец-то я узнал, как установить это свойство соединения в WebSphere 8 для источника данных XA.Его можно установить в консоли администратора WebSphere: Ресурсы> Поставщики JDBC> [Драйвер Oracle JDBC (XA)]> Источники данных> [имя источника данных]> Пользовательские свойства

Просто добавьте туда свойство с ключом:connectionProperties и его значение: v$session.program:PUT_YOUR_NAME_HERE

0 голосов
/ 14 февраля 2014

Это работает для меня, используя Spring.Это должно работать и для вашего приложения Java EE.Идея состоит в том, чтобы установить параметр v $ session косвенно через свойства, передаваемые в connectionProperties свойство

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