2017-02-03 8 views
1

Я нашел несколько ответов на проблему, но ни один из них не смог сделать работу в моем случае. Моя проблема заключается в том, что я загружаю источник данных из моей конфигурации JBoss с пружиной:

<xa-datasource jndi-name="java:jboss/jdbc/oracleDatasource" pool-name="jdbc/oracleDatasource" enabled="true"> 
       <xa-datasource-property name="URL"> 
        jdbc:oracle:thin:@URL:1522:SID 
       </xa-datasource-property> 
       <xa-datasource-property name="connectionProperties"> 
        v$session.program=MyAPP 
       </xa-datasource-property> 
       <driver>oracle-jdbc</driver> 

Пружина нагрузки производится следующим образом:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="java:jboss/jdbc/oracleDatasource"/> 
</bean> 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <constructor-arg ref="dataSource"/> 
</bean> 

Как вы можете видеть, я установить v$session.program Недвижимость в JBoss, хорошо работает.

Проблема в том, что у меня есть несколько приложений (войны), которые можно развернуть на одном сервере JBoss, используя эту конфигурацию. В этом случае я хочу, чтобы каждое мое приложение имело собственное имя, записанное в свойстве v$session.program.

В принципе, я хотел бы иметь возможность загружать один и тот же источник данных в каждое приложение, но каждый из них использует свое собственное имя для регистрации свойства программы в Oracle. Возможно ли, или у меня должен быть один источник данных для каждого размещенного приложения?

+1

Будет ли альтернативой размещение информации в 'v $ session.module' или' v $ session.client_info'? –

+0

Да, это была бы жизнеспособная альтернатива (поле client_info не используется), но я столкнулся с той же проблемой с этим, я не знаю, как установить это свойство после загрузки источника данных.Поскольку соединение создается автоматически с помощью вызова jdbcTemplate, я не могу изменить его свойства при создании соединения, как объясняется в этом сообщении: http://stackoverflow.com/questions/2876956/setting-client-info-in-jdbc-for -oracle. – user3218683

ответ

0

Единственное, что вам нужно, чтобы перехватывать каждый вызов GetConnection из пула соединений.

Вы должны получить реальную Oracle связь - не прокси - и вызовите setClientInfo на 12с или setEndToEndMetrics в более ранних версиях, чтобы установить действие/клиент/модуль идентификации.

Пример: here.

Также обратите внимание, что использование пакета DBMS_APPLICATION_INFO для этой же цели работает хорошо, но это производит туда и обратно на один сервер слишком много. Значение setClientInfo не вызывает вызов сервера, но сохраняет эту информацию для следующего выполнения инструкции (что является методом сохранения преформации).

Также обратите внимание, что для использования этой функции ваш драйвер должен идеально соответствовать вашей базе данных - странные исключения, которые вы можете видеть при настройке информации о клиенте, в большинстве случаев вызваны несовместимостью драйвера JDBC и РСУБД.

+0

Спасибо за ваш ответ, я попытался получить реальное соединение, но застрял в корпусе из-за того, что структура создает свою собственную связь. Я использовал dmbs_application_info, теперь это трюк для меня. Я установил режим активации для этой информации, чтобы у меня не было дополнительного вызова для каждого соединения, но только в определенное время, для меня это достаточно. Спасибо! – user3218683

+0

@ user3218683, вы правы; каждая структура завершает соединение в собственном прокси-объекте. Вы можете проверить javadoc на метод вроде * getConnection *, который возвращает исходное соединение с БД. И, конечно, DBMS_APPLICATION_INFO работает отлично, но, как сказано, стоит еще одно путешествие туда и обратно. * Не стесняйтесь проголосовать или принять ответ, который вы нашли полезным:) * –

0

Если поместить эту информацию в v$session.module или v$session.client_info, это вариант, вы можете использовать код Java.

Все, что вам нужно сделать, это позвонить dbms_application_info.set_module() или dbms_application_info.set_client_info() после того, как ваш код Java получил соединение с источником данных.

Что-то вроде этого:

Connection conn = ... // get connection from the DataSource 
CallableStatement cstmt = conn.prepareCall("{call dbms_application_info.set_client_info(?)}"); 
cstmt.setString(1, "Some interesting information"); 
cstmt.execute(); 
+0

Это подход PL/SQL, который должен использоваться только в том случае, если решение JDBC не работает для конкретного драйвера JDBC и версии СУРБД –