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