是否可以从SQLException对象获取JDBC Connection对象?

时间:2014-05-17 09:49:30

标签: java jdbc jersey jax-rs

这就是我想要做的:我正在使用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对象,以便我可以在异常映射器内回滚连接。这可能吗?与此问题无关的另一个问题是:我在数据库调用之间进行了大量的数学处理。我完成每个阶段后关闭连接并在下一阶段开始时打开它。所以在一个请求中我做了多次打开/关闭。这是不好的模式吗?

3 个答案:

答案 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;你根本没有代码来管理两个层中的异常(你将提交和回滚委托给框架)