我使用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
正在接受全池?
亲切的问候。