2016-10-07 9 views
1

MyBatis 3.3.1、Spring 4.3、Jersey 2.22、Oracle 12cを使用してレストサービスを作成しています。私のトランザクションは、DataSourceTransactionManagerと@Transactionアノテーションを使用してSpringによって管理されています。また、MyBatisプールデータソースをjavax.sql.DataSourceとして使用しています。なぜデータベースセッションが再利用されているのか分かりません。MyBatis + Spring + Jersey with SQLセッションを再利用するようです。

私のアプリケーションでは、Oracleクライアント識別子DBMS_SESSION.SET_IDENTIFIER( "my id")を設定しています。デバッグ・ロギング・ステートメントでは、MyBatisが各MyBatis SQL操作の新しいセッションを作成していることがわかります。また、DBMS_SESSION.UNIQUE_SESSION_IDからデータベース・セッション識別子を出力するためのデバッグもあります。

私が理解していないことは、休憩のエンドポイントに複数回アクセスすると、一意のセッションIDが同じであり、最後のアクセスのIDがまだ設定されているということです。

MyBatisが新しいSQLSessionを取得するたびに、新しいOracleセッションを使用しないでください。なぜoracleセッションは常に同じですか?

ありがとうございました。

答えて

0

Oracleのセッションは接続にバインドされています。 接続プーリングを使用しているため、1つの残りの要求が完了した後、接続プールに接続が戻されます。この場合、セッションは終了しません。

プールへの接続を戻し、プールからの接続を取得するときに識別子を設定すると、おそらく識別子を消去する必要があります。正確な方法は、使用している接続プールによって異なります。組み込みのmybatis接続プールの場合は、this answerを参照してください。

+0

こんにちは、あなたのご意見ありがとうございました。トランザクションと同様のことをやろうとしました。トランザクションが開始されたときに正しいセッション変数が設定され、トランザクションが終了したときに削除されました。しかし、デバッグに基づいて、MyBatisの呼び出しは@Transactionalメソッド内でセッションを複数回作成するようです。セッションが作成され、現在のトランザクションに追加されているのがわかります。複数のセッションがトランザクションを構成すると予想されますか?トランザクションがコミットすると、すべてのセッションでコミットされますか? – tux

+0

これはspringとmybatisの設定によって異なります。通常、1つのセッションがトランザクションの期間作成されます。このロジックを実装する中心的な方法は 'org.mybatis.spring.SqlSessionUtils.getSqlSession'です。 –

+0

あなたの問題は、2つのデータソースがあることだと思います。 1つはmybatisで構成され、もう1つはspringで管理されます。 Springはmybatisプールされたデータソースについて知りません。 'SqlSessionFactory'はどのように設定されていますか? –

関連する問題