2016-04-13 8 views
0

を使用するJavaアプリケーションがあり、空間機能(geolatte)はWeblogic 12.1.1.0およびOracleデータベースで実行されています。私は、ドライバoracle.jdbc.xa.client.OracleXADataSourceで設定されたいくつかのデータソースを持っています。ある環境では正常に動作しますが、別の環境では正常に動作しません。クエリを実行しているとき、私は、次のスタックトレースを取得する:OracleConnectionを取得しようとしましたが、NULLを受け取りました。

org.hibernate.HibernateException: java.lang.RuntimeException: Tried retrieving OracleConnection from weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection using method getOriginalOwner, but received null. 
    at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.toNative(SDOGeometryValueBinder.java:88) 
    at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.bind(SDOGeometryValueBinder.java:53) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:253) 
(...) 
Caused by: java.lang.RuntimeException: Tried retrieving OracleConnection from weblogic.jdbc.wrapper.JTAConnection_weblogic_jdbc_wrapper_XAConnection_oracle_jdbc_driver_LogicalConnection using method getOriginalOwner, but received null. 
    at org.geolatte.geom.codec.db.oracle.DefaultConnectionFinder.find(DefaultConnectionFinder.java:75) 
    at org.geolatte.geom.codec.db.oracle.OracleJDBCTypeFactory.createStruct(OracleJDBCTypeFactory.java:117) 
    at org.hibernate.spatial.dialect.oracle.SDOGeometryValueBinder.store(SDOGeometryValueBinder.java:72) 

私はHibernateが呼び出されたgeolatte-geomライブラリ内のコードを見ているとき、私は以下のようにDefaultConnectionFinder.javaを参照してください。

for (Method method : con.getClass().getMethods()) { 
     if (method.getReturnType().isAssignableFrom(
       java.sql.Connection.class 
     ) 
       && method.getParameterTypes().length == 0) { 

      try { 
       method.setAccessible(true); 
       final Connection oc = find((Connection) (method.invoke(con, new Object[] { }))); 
       if (oc == null) { 
        throw new RuntimeException(
          String.format(
            "Tried retrieving OracleConnection from %s using method %s, but received null.", 
            con.getClass().getCanonicalName(), 
            method.getName() 
          ) 
        ); 
       } 
       return oc; 
      } 

ことがありますWeblogicが提供する接続ラッパーを取得し、リフレクションを使用してすべての使用可能なメソッドを繰り返します。それはjava.sql.Connection.classを返し、入力パラメータを返さないメソッドを探している実際の接続を取得しようとします。

私の推測では、それはnullを返しgetOriginalOwner方法は、最初に行く場合、することができ、見つかったメソッドはgetConnectionある時代のが、この場合はほとんどが、getMethods()として特定の順序で値を返さないことです例外が発生します。

私は間違ったことをやっていると思いますか、これを避けるか、またはHibernateエラーです。ヌルでないときに接続を返す必要があります。ただ反復)または同様のものに保ちます:

final Connection oc = find((Connection) (method.invoke(con, new Object[] { }))); 
if (oc != null) { 
    return oc; 
} 

答えて

1

は目的がConnectionFinderインタフェースであるかの説明についてはhttp://www.hibernatespatial.org/documentation/03-dialects/05-oracle/を参照してください。

環境でDefaultConnectionFinderが機能しない場合は、適切なOracleConnectionインスタンスを戻す独自の実装を作成し、hibernate.spatial.connection_finder構成プロパティを使用して構成する必要があります。

+0

こんにちはカレルMaesen、応答のおかげで、私はそれが価値を追加すると思います。とにかく私は、あなたが潜在的に接続を返すメソッドを見つけるとすぐにRuntimeExceptionをスローするのだろうと思っていますが、(getOriginalOwnerの場合のように)残りの候補を繰り返し処理するのではなく、上のコードスニペットのように優れています。これはこの競合状態を示すWeblogic 12.1.1.0だったので、この実装はカバーされていると思いました。 – krause

関連する問題