我使用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;
}
我有幾個問題:
我使用錯誤的工具這份工作?我希望我的整個方法是一個事務,但我有一種感覺,ORMLite的TransactionManager不是爲此而做的。
在事務中發生的每個異常都被包裝到SQLException中(通過TransactionManager)。我無法區分和/或處理不同類型的例外情況。他們都被抓到了Exception塊。我應該如何處理?
編輯: 我發現了一個可能的解決方法。
我整個REST方法的生命週期中使用單個連接實例(從ConnectionSource.getReadWriteConnection())
獲得。 我可以設置自動提交到虛假所述連接和做手工回滾如果異常被拋出。
問題是,我DAO
對象是使用JdbcPooledConnectionSource
其初始化
這發生在我唯一的問題是這個安全上做服務器將獲得〜每秒10-20的要求 - 必須有一個原因DAO
正在接受全池?
親切的問候。