我正在使用ORMLite框架创建RESTful Web服务作为ORM。 重要的是我的一些服务是一个事务 - 如果发生任何异常,数据库应该回滚。
以下是我创建的方法之一:
onActivityCreated
我有几个问题:
我是否使用错误的工具来完成这项工作?我希望我的整个方法都是一个事务,但我觉得来自ORMLite的TransactionManager不是为此做的。
事务中发生的每个异常都包含在SQLException中(通过TransactionManager)。我无法区分和/或处理不同类型的异常。它们都被异常块所捕获。我应该怎么做?
修改: 我找到了可能的解决方法。
我可以使用单个连接实例(在整个REST方法的生命周期中从@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;
}
获得。
我可以在所述连接上将auto-commit设置为false,并在抛出异常时进行手动回滚。
问题是我的ConnectionSource.getReadWriteConnection())
个对象正在使用DAO
进行初始化。
我遇到的唯一问题是在服务器上安全可行,每秒可获得约10-20个请求 - 必须有JdbcPooledConnectionSource
接受整个池的原因吗?
亲切的问候。
答案 0 :(得分:0)
不,是的。在“可能的解决方法”部分中,这正是我是否使用错误的工具来完成这项工作?我希望我的整个方法都是一个事务,但我觉得来自ORMLite的
TransactionManager
不是为此做的。
TransactionManager
正在做的事情:
事务中发生的每个异常都包含在SQLException中(由
TransactionManager
)。
右。 TransactionManager
需要捕获异常,以便它可以回滚事务,但我不想从方法中抛出Exception
。
您可以捕获SQLException
,然后手动检查e.getCause()
输出。如果你想看看例外情况,有点苛刻但是必要。
在服务器上这样做是否安全,每秒可以获得~10-20个请求 - DAO是否有理由接受整个池?
我不是100%肯定你的意思是安全的。我假设Android可以同时处理10-20个打开的数据库连接。对于Android / Sqlite而言,这更像是一个问题,然后是ORMLite。当然,这假设您的db作业完成所需的时间不到一秒。