这就是我想要做的:我正在使用JAX-RS编写Restful应用程序。我编写了一个异常映射器来将SQLException
映射到HTTP状态代码500。
@Provider
public class SQLExceptionMapper implements ExceptionMapper<SQLException> {
@Override
public Response toResponse(SQLException exception) {
Logger.error(exception);
return Response.serverError().build();
}
}
我在代码中有很多这样的情况:
try {
conn.setAutoCommit(false);
/* do some stuff */
conn.commit();
} catch (SQLException ex) {
conn.rollback();
/* re-throw SQLException again so exception mapper converts it to HTTP status 500 */
throw ex;
} finally {
conn.setAutoCommit(true);
conn.close();
}
其实我不喜欢conn.rollback(); throw ex;
。我真正想要的是从Connection
对象获取JDBC SQLException
对象,以便我可以在异常映射器内回滚连接。这可能吗?与此问题无关的另一个问题是:我在数据库调用之间进行了大量的数学处理。我完成每个阶段后关闭连接并在下一阶段开始时打开它。所以在一个请求中我做了多次打开/关闭。这是不好的模式吗?
答案 0 :(得分:1)
我认为这是不可能的。 SQL-Exception没有存储连接的属性
答案 1 :(得分:1)
是否可以从SQLException对象获取JDBC Connection对象?
没有
答案 2 :(得分:1)
您可以进行声明式事务管理,例如Spring框架。这将使您免受许多样板代码的影响,并使您的数据访问层非常干净,以及业务逻辑。
http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch11s05.html
我们的想法是在您的数据访问层之上建立一个事务服务层;服务层会坦诚地称呼你的daos,并声明自己@Transactional
;你根本没有代码来管理两个层中的异常(你将提交和回滚委托给框架)