1

Hibernate 3.6 から Hibernate 4.1.x に切り替えたので、トランザクション/セッション管理に問題があります。

Spring 3.1.2、Hibernate 4.1.4、WebSphere 8.5、および Oracle 11 を使用しています。

私のWebAppでは、いくつかのメソッドを次のようにマークしました:

@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)

それは、OpenSessionInViewFilter と getSessionFactory().getCurrentSession() を使用する私の webapp で正常に機能しています。

しかし、私のコードの一部は JMS または Quartz ジョブ (OpenSessionInViewFilter なし) によって呼び出され、結果として

org.hibernate.HibernateException: No Session found for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)

インターネットでいくつかの調査を行った後、トランザクションを次のように変更しました。

@Transactional(propagation = Propagation.REQUIRED, readOnly = true)

開いているセッションがあり、Tomcat ではすべて問題ありませんが、WebSphere では次のエラーが発生します。

[SqlExceptionHelper] : SQL Error: 0, SQLState: null
[SqlExceptionHelper] : DSRA9010E: 'setReadOnly' wird in der WebSphere-Implementierung  java.sql.Connection nicht unterstützt.

一部の投稿によると、Oracle は読み取り専用をサポートしていません。ただし、Propagation.SUPPORTS または Tomcat を使用すると機能します。今、私は何をすべきかわかりません。JMS によって呼び出されたすべてのメソッドに Propagation.REQUIRED および readOnly = false を付けますか?

より良いアイデアはありますか?それとも、これは WebSphere を使用している場合の Spring のバグですか?

4

2 に答える 2

0

エラーを英語に翻訳すると、次のようになります。

DSRA9010E: 'setReadOnly' is not supported in the WebSphere implementation java.sql.Connection

これはバグではなく、単に読み取り専用を実装していないということです。readonly は通常、接続作成スコープの属性であるため、接続プールを使用する場合にも理解できます。

さらに、読み取り専用は jdbc プロバイダーの「提案」にすぎません。jdbc プロバイダーはそれを無視できますが、私が知る限り、多くのプロバイダーは実際には何もしていません。

readonly を指定しないでください。


以下の Sam のコメントに答えるには: Hibernate はそのエラーとは何の関係もありません。2003年 6 月以降、Oracle で Websphere を使用すると DSRA9010E エラーが発生するのは、Java.sql.Connection を実装するWebsphereコンポーネントです。コード DSRA9010E および説明:"'setReadOnly' is not supported on the IBM WebSphere Application Server java.sql.Connection implementation"

問題の解決

2003 年 6 月に、Application Server のコード障害 168102 が変更されました。2003 年 6 月より前は、setReadOnly(true) メソッドが Application Server の内部フラグを設定していましたが、この情報は Oracle データベースに伝達されませんでした。2003 年 6 月以降のバージョンでは、Application Server は上記のエラーを発行します。

記事全体の私の理解では、問題を解決するために、欠陥 168102 の解決策として、問題を解決するために後でそのエラーを追加したということです。サポートしていません。

記事の最後で、最新バージョン (エラーが発生するバージョン) にアップグレードすることをお勧めします。

于 2012-11-09T15:40:32.013 に答える
0

はい、Oracle は読み取り専用をサポートしていないため、このヒントは無視されます。パフォーマンスが少し低下する可能性があります。これらのフラグを削除できます。代わりに、エンティティ レベル @Immutable にするか (この注釈には少し注意が必要です)、エンティティ フィールド @column(updatable = false, insertable = false) を更新できます。

于 2012-11-09T15:51:45.200 に答える