2016-11-12 4 views
0

私たちは、SpringセキュリティのJdbcTokenStoreを使用してoAuth2アクセストークンを保持しています。同じアプリケーションは、spring-data-jpaにも大きく依存しています。どちらもMySQLデータベースへの接続プールを共有しています。spring-data-jpaとspring-security-oauthのJdbcTokenStoreの間でJdbc接続プールを共有する場合、トランザクションの処理方法は?

Jdbcはデフォルトで自動コミットモードになり、JdbcTokenStoreは自動コミットがオンであるという前提で書かれているようです。明示的に変更をコミットすることはありません。

一方、SpringデータとJPAは書き込み操作のトランザクションを必要とします。アプリケーションは@Transactionalアノテーションを使用します。

私たちは、次の問題を観察している:

  • 要求は、(1):クライアントがアクセストークンを取得します。 JdbcTokenStoreこれをデータベースに挿入します。
  • 要求(2):クライアントは、その後の要求でこのアクセストークンを使用します。トークンがデータベース内に見つからないため、この要求は拒否されます。

この動作は、request(1)のトランザクションがまだコミットされていないと説明できます。

私はSpringの内部についてあまりよく知らないです。次のことが起こる可能性はありますか?

  • JPA操作の中には、プールからJDBC接続#1を取得し、auto-commit = offを設定し、任意の数のSQL文を実行してからコミットします。
  • リクエスト(1):JdbcTokenStoreは同じJDBC接続#1を取得し、INSERT文を実行します。
  • リクエスト(2):JdbcTokenStoreは別のJDBC接続#2を取得し、SELECT文を実行します。 (コミットされていないトランザクションは表示されません)
  • 一部のJPA操作は、JDBC接続#1を再度取得し、コミットします。 (oAuthトークンはコミットされました)

これを回避する構成はありますか?

答えて

0

根本原因を説明できませんが、解決策が見つかりました。HikariCP JDBC接続プール(Tomcatの代わり)に切り替えると、説明問題のすべての現象が解消されました。

関連する問題