3

私は、Tomcat で実行され、Postgres データベース上で Tomcat 接続プールを使用し、アプリケーションが ORM に OpenJPA を使用する Java EE アプリを持っています。

一部の操作では、postgres から LargeObjectManager API にアクセスする必要があります。これには、実際の postgres 接続オブジェクトへの参照が必要です。

そこで、OpenJPA から取得した接続オブジェクトを掘り下げて、実際の Postgres のものを取得しようとしています。しかし、「sun.misc.proxy.$ProxyNN」オブジェクトに止められてしまい、さらに先に進む方法がわかりません。

これが私が今していることです:

OpenJPAEntityManager oem = OpenJPAPersistence.cast(em);
// get open JPA connection object
Connection c = oem.getConnection();
// all the way down to what's no longer OpenJPA
c = ((DelegatingConnection)c).getInnermostDelegate()

そして、それが私が止まるところです。返されるオブジェクトは次のとおりです。その上で ProxyConnection メソッドを呼び出すことはできず、誰がこれらのプロキシを作成したのかもわかりません (しかし、Tomcat DBCP だと思います)。

c = {com.sun.proxy.$Proxy5@1793}"ProxyConnection[PooledConnection[Pooled connection wrapping physical connection org.postgresql.jdbc4.Jdbc4Connection@a7a434]]"
   h = {org.apache.tomcat.jdbc.pool.ProxyConnection@5671}"ProxyConnection[PooledConnection[Pooled connection wrapping physical connection org.postgresql.jdbc4.Jdbc4Connection@a7a434]]"
    connection = {org.apache.tomcat.jdbc.pool.PooledConnection@5673}"PooledConnection[Pooled connection wrapping physical connection org.postgresql.jdbc4.Jdbc4Connection@a7a434]"
    poolProperties = {org.apache.tomcat.jdbc.pool.PoolProperties@5676}"ConnectionPool[defaultAutoCommit=false; defaultReadOnly=null; defaultTransactionIsolation=-1; defaultCatalog=null; driverClassName=null; maxActive=100; maxIdle=100; minIdle=10; initialSize=10; maxWait=30000; testOnBorrow=false; testOnReturn=false; timeBe...
      connection = {com.sun.proxy.$Proxy0@5677}"Pooled connection wrapping physical connection org.postgresql.jdbc4.Jdbc4Connection@a7a434"
        h = {org.postgresql.ds.jdbc23.AbstractJdbc23PooledConnection$ConnectionHandler@5686}
          xaConnection = null
          abandonTrace = null
          timestamp = 1372621172141
          lock = {java.util.concurrent.locks.ReentrantReadWriteLock@5678}"java.util.concurrent.locks.ReentrantReadWriteLock@9267fe[Write locks = 0, Read locks = 0]"
          discarded = false
          lastConnected = 1372620679402
          lastValidated = 1372620679398
          parent = {org.apache.tomcat.jdbc.pool.ConnectionPool@5674}
          attributes = {java.util.HashMap@5679} size = 2
          handler = {org.apache.tomcat.jdbc.pool.ProxyConnection@5671}"ProxyConnection[PooledConnection[Pooled connection wrapping physical connection org.postgresql.jdbc4.Jdbc4Connection@a7a434]]"
          released = {java.util.concurrent.atomic.AtomicBoolean@5680}"false"
          suspect = false
          driver = null
          pool = {org.apache.tomcat.jdbc.pool.ConnectionPool@5674}
          properties = null
          next = null
          useEquals = true

tomcat: 7.0.22 postgres jdbc:9.2-1002 openJPA: 2.1.1

4

1 に答える 1

2

これを試してみてください。多少の調整が必要になる場合がありますが、そのままで機能するか、少なくともアンラップする必要があるプロキシがどこにあるかについての有用なポインタを提供するはずです


//unwrap proxy invocation handler
org.apache.tomcat.jdbc.pool.ProxyConnection tomcatProxy = (ProxyConnection) Proxy.getInvocationHandler(c);

org.apache.tomcat.jdbc.pool.PooledConnection tomcatPooledConnection = tomcatProxy.getConnection(); //if this doesn't work try getDelegateConnection!

Connection connection = tomcatPooledConnection.getConnection();

それから試してください


org.postgresql.jdbc4.Jdbc4Connection jdbc4conn = (org.postgresql.jdbc4.Jdbc4Connection) connection;
jdbc4conn.getLargeObjectAPI();

上記のキャストが失敗した場合は、次を試してください。


org.postgresql.ds.jdbc23.AbstractJdbc23PooledConnection psAbstractPooledConn = Proxy.getInvocationHandler(connection.getProxy().getConnection());

それが機能しない場合は、これらの他のオブジェクトとその属性に関する詳細情報を提供できれば非常に役立ちますが、ここでのアイデアは、JDK プロキシと Tomcat プロキシからの接続を使用して生成された呼び出しハンドラを取得することです。

于 2013-07-01T06:21:47.067 に答える