Oracle 以编程方式设置v$会话程序属性

Oracle 以编程方式设置v$会话程序属性,oracle,jdbc,jboss,Oracle,Jdbc,Jboss,我在这个问题上找到了一些答案,但没有一个是我能解决的。我的问题是,我使用spring从JBoss配置加载数据源: <xa-datasource jndi-name="java:jboss/jdbc/oracleDatasource" pool-name="jdbc/oracleDatasource" enabled="true"> <xa-datasource-property name="URL">

我在这个问题上找到了一些答案,但没有一个是我能解决的。我的问题是,我使用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>

jdbc:oracle:thin:@URL:1522:SID
v$session.program=MyAPP
oracle jdbc

弹簧荷载按如下方式进行:

<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中记录程序属性。是否可能,或者我必须为每个托管的应用程序提供一个数据源?

如果将此信息放入
v$session.module
v$session.client_info
是一个选项,您可以使用Java代码执行

您所需要做的就是调用或在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();

您唯一需要它来拦截连接池中的每个getConnection调用

您必须获得真正的Oracle连接(而不是代理),并在12c上调用setClientInfo,或在旧版本中调用setEndToEndMetrics,以设置操作/客户端/模块标识

一个例子见

还请注意,出于同样的目的使用dbms_application_info也可以,但这会产生太多的单服务器往返。setClientInfo不生成服务器调用,但存储下一个语句执行的信息(这是性能保存方法)


还要注意,要使用此功能,您的驱动程序必须与您的数据库完美匹配-在设置客户端信息时,您可以看到的奇怪的例外情况在大多数情况下是由JDBC驱动程序和RDBMS的不兼容造成的。

将信息放入
v$session.module
v$session.client\u info
是一个可行的选择吗备选方案(未使用字段client_info),但我面临与此相同的问题,我不知道在加载数据源后如何设置此属性。由于连接是使用jdbcTemplate调用自动创建的,因此我无法在创建连接时修改其属性,正如本文中所解释的:。这是PL/SQL方法,仅在JDBC解决方案无法用于特定JDBC驱动程序和RDBMS版本时使用。请回答,我试图获得真正的连接,但由于框架创建了自己的连接,我被困在一个案例中。我使用了dmbs_应用程序_信息,它现在为我实现了这个技巧。我为这个信息设置了一个激活模式,这样我就不会在每个连接上都有额外的呼叫,而只是在特定的时间,这对我来说就足够了。谢谢大家!@user3218683,你是对的;每个框架将连接封装在自己的代理对象中。您可以在javadoc中检查像getConnection这样返回原始数据库连接的方法。当然,DBMS_应用程序_INFO运行良好,但正如所说的那样,需要多花一次往返时间。请随意投票或接受您认为有用的答案:)