2015-09-17 234 views
1

我使用ORMLite使用ORMLite框架來創建REST風格的Web服務。 重要的是我的一些服務是一個事務 - 如果發生任何異常,數據庫應該回滾。使用ORMLite在REST風格的Web服務中進行事務

這裏是我創建的方法之一:

@POST 
@CONSUMES(MediaType.APPLICATION_JSON) 
@PRODUCES(MediaType.APPLICATION_JSON) 
public JSONResponeseLogin getJson(LoginRequest request) { 

    /* Extract data from request */ 

    openDBConnection(); 
    try { 
     TransactionManager.callInTransaction(conn,() -> { 
      /* Validate user input and store data to database */ 
     }); 
    } catch (InvalidDataInRequestException ex) { 
     meta.addError(new ServiceError(errorCode)); 
     logger.info("Error code: "+ errorCode + " " + ServiceErrorCode.textFromErrorCode(errorCode)); 
     logger.info("Request: " + request.toString()); 
     logger.catching(ex); 
    } catch (Exception e) { 
     meta.addError(new ServiceError(errorCode)); 
     logger.info("Error code: "+ errorCode + " " + ServiceErrorCode.textFromErrorCode(errorCode)); 
     logger.info("Request: " + request.toString()); 
     logger.catching(ex); 
    } finally { 
     closeDBConnection(); 
    } 

    response.setMetaData(meta); 
    return response; 
} 

我有幾個問題:

  1. 我使用錯誤的工具這份工作?我希望我的整個方法是一個事務,但我有一種感覺,ORMLite的TransactionManager不是爲此而做的。

  2. 在事務中發生的每個異常都被包裝到SQLException中(通過TransactionManager)。我無法區分和/或處理不同類型的例外情況。他們都被抓到了Exception塊。我應該如何處理?

編輯: 我發現了一個可能的解決方法。

我整個REST方法的生命週期中使用單個連接實例(從ConnectionSource.getReadWriteConnection())獲得。 我可以設置自動提交到虛假所述連接和做手工回滾如果異常被拋出。

問題是,我DAO對象是使用JdbcPooledConnectionSource其初始化

這發生在我唯一的問題是這個安全上做服務器將獲得〜每秒10-20的要求 - 必須有一個原因DAO正在接受全池?

親切的問候。

回答

0

我是否在這項工作中使用了錯誤的工具?我想我的整個方法是一個交易,但我有一種感覺,來自ORMLite的TransactionManager不是爲了這個。

不,它是。在您的「可能的解決方法」部分,這正是TransactionManager正在做的:

  • 獲取單個連接。
  • 停止自動提交。
  • 開始交易。
  • 做數據庫工作。
  • 停止並提交事務。
  • 恢復自動提交。

發生在事務每個異常,包裹成的SQLException(由TransactionManager)。

沒錯。 TransactionManager需要捕捉異常,以便回滾事務,但我不想從方法中拋出Exception

您可以捕獲SQLException,然後手動檢查e.getCause()輸出。有點蹩腳,但如果你想看看例外情況,這是必要的。

這是安全的服務器上會做〜每秒10-20個請求 - 必須有一個原因DAO接受整個池?

我不是100%確定你的意思是安全。我假設Android可以一次處理10-20個打開的數據庫連接。這對於Android/Sqlite和ORMLite來說更是一個問題。這當然假定你的數據庫作業完成所需的時間不到一秒鐘。