如何在运行时从连接池声明中获取用户名

时间:2015-03-25 11:04:50

标签: java tomcat connection-pooling

我的连接池在tomcat服务器的context.xml中声明如下:

<Resource name="jdbc/codesign" auth="Container"
          type="javax.sql.DataSource" driverClassName="oracle.jdbc.OracleDriver"
          url="jdbc:oracle:thin:@abc.fjd.com"
          username="tiger" password="tiger123" maxActive="30" maxIdle="10" 
          poolPreparedStatements="true" maxOpenPreparedStatements="100"
          validationQuery="SELECT SYSDATE FROM DUAL" maxWait="10000"/>

我正在以通常的方式初始化数据源:

Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
ds = (DataSource) envContext.lookup("jdbc/codesign");

我想要的是在运行时访问用户名(&#34; tiger&#34;在这种情况下)。我在javax.sql.DataSource课程中没有看到任何这样的方法。当我尝试使用

从连接中获取模式时
Connection conn = DataSourceConnectionPool.getConnection()
conn.getSchema();

我收到以下错误:

java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.getSchema()

如果首先解开连接,我会得到同样的错误:

conn.unwrap(OracleConnection.class).getSchema()
java.lang.AbstractMethodError: oracle.jdbc.driver.OracleConnection.getSchema()

是否可以从数据源或连接获取架构名称或用户名?

1 个答案:

答案 0 :(得分:1)

如果您使用的是Tomcat,那么您的DataSoruce实现很可能是BasicDataSource https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/tomcat/dbcp/dbcp2/BasicDataSource.html

您可以将ds转换为BasicDataSource,并通过getUsername()访问该用户。

但是当然首先尝试打印db.getClass()。getName()以查看实际的实现。