我找到了一些关于这个问题的答案,但没有一个我可以在我的案例中工作。我的问题是我用spring:
从我的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>
正如您所看到的,我在JBoss中设置了v$session.program
属性,它运行良好。
问题是我有几个应用程序(war)可以使用此配置部署在同一JBoss服务器上。在这种情况下,我想要做的是让我的每个应用程序都有自己的名称写在v$session.program
属性中。
基本上,我希望能够在每个应用程序上加载相同的数据源,但是让每个应用程序使用自己的名称来记录oracle DB中的程序属性。是否可以或者我必须为每个托管的应用程序提供一个数据源?
答案 0 :(得分:0)
如果将此信息放入v$session.module
或v$session.client_info
是一个选项,则可以使用Java代码。
您需要做的就是在Java代码从数据源获得连接后调用dbms_application_info.set_module()
或dbms_application_info.set_client_info()
。
这样的事情:
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();
答案 1 :(得分:0)
拦截来自连接池的 getConnection 的每次调用都是唯一需要的。
您必须获得真正的Oracle连接 - 而不是代理 - 并在12c上调用 setClientInfo 或在旧版本中调用 setEndToEndMetrics 来设置操作/客户端/模块标识。
示例请参阅here。
另请注意,为此目的使用 dbms_application_info 也可以,但会产生一个服务器往返太多。 setClientInfo 不会产生服务器调用,但会将此信息存储为下一个语句执行(这是性能保存方法)。
另请注意,要使用此功能,您的驱动程序必须与您的数据库完美匹配 - 在设置客户端信息时您可以看到的奇怪的例外情况在很多情况下是由JDBC驱动程序和RDBMS的不兼容引起的。