2016-11-12 48 views
0

我們使用spring-security的JdbcTokenStore來保存oAuth2訪問令牌。同樣的應用程序也嚴重依賴於spring-data-jpa。兩者共享連接池到MySQL數據庫。在spring-data-jpa和spring-security-oauth的JdbcTokenStore之間共享Jdbc連接池時,如何處理事務?

Jdbc默認爲自動提交模式,並且JdbcTokenStore顯示爲假定自動提交處於打開狀態。它從不明確提交更改。

另一方面,Spring數據和JPA需要寫入操作的事務。該應用程序使用@Transactional註釋。

我們正在觀察了以下問題:

  • 請求(1):客戶端獲得訪問令牌。 JdbcTokenStore將其插入到數據庫中。
  • 請求(2):然後,客戶端在隨後的請求中使用此訪問令牌。由於在數據庫中找不到令牌,此請求被拒絕。

如果請求(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)的淘汰描述問題的所有症狀。