Tomcat JDBC 的 Oracle VPD 会话问题
Posted
技术标签:
【中文标题】Tomcat JDBC 的 Oracle VPD 会话问题【英文标题】:Oracle VPD Session issue with Tomcat JDBC 【发布时间】:2017-08-29 13:30:37 【问题描述】:我的目标是能够使用带有 Oracle VPD 的 Tomcat JDBC 创建“隔离会话”。如何在 Eclipse Link 中实现类似于 SessionEventAdapter 的概念,但具有更多 Tomcat 连接池。我当前的客户端代码如下:
InitialContext initCtx = new InitialContext();
Context jndi = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) jndi.lookup("jdbc/" + _jdbcResource);
_connection = ds.getConnection();
_statement = _connection.prepareStatement(sqlStatement);
Context.xml中的资源定义
<Resource defaultAutoCommit="true" defaultReadOnly="false"
driverClassName="oracle.jdbc.OracleDriver"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
fairQueue="false" initialSize="10"
jdbcInterceptors="ConnectionState;" jmxEnabled="true"
logAbandoned="true" maxActive="100" maxIdle="100"
maxWait="30000" minEvictableIdleTimeMillis="5000"
minIdle="10" name="jdbc/OracleApps" password="APPS"
removeAbandoned="true" removeAbandonedTimeout="600"
testOnBorrow="true" testOnReturn="true" testWhileIdle="true" timeBetweenEvictionRunsMillis="5000"
type="javax.sql.DataSource" url="jdbc:oracle:thin:testmenot:1521:DEV"
useEquals="false" username="APPS" validationInterval="30000" validationQuery="SELECT 2+2 FROM DUAL"/>
如果需要任何信息,请告诉我。
谢谢。
【问题讨论】:
【参考方案1】:使用 Tomcat DBCP
时通过解包连接来设置客户端上下文的唯一方法DataSource ds = (DataSource)ctx.lookup(jndi);
Connection conn = ds.getConnection();
if (conn.isWrapperFor(oracle.jdbc.OracleConnection.class))
OracleConnection oraCon=conn.unwrap(oracle.jdbc.OracleConnection.class);
--Only Context, Parameter name, Parameter Value
oraCon.setApplicationContext("CLIENTCONTEXT", "ORACLE_USER_ID", userId);
注意:Oracle JDBC 瘦驱动仅支持一种上下文,即 CLIENTCONTEXT
【讨论】:
以上是关于Tomcat JDBC 的 Oracle VPD 会话问题的主要内容,如果未能解决你的问题,请参考以下文章
tomcat 8.5.x tomcat-jdbc.jar vs 官方 oracle ojdbc6.jar 驱动
tomcat:如何打开 jdbc:oracle 连接的堆栈跟踪?
Tomcat 8.0.15 Oracle 11 数据库和 jdbc javax.naming.NamingException