我在执行sql语句时得到以下执行


SQLServerException:服务器无法恢复事务。
的编号:69d00000016。


我知道以下DAO实施不正确。我想知道以下代码的正确实现是什么,以及我的connFactory被声明为静态的事实是否会导致上述错误。

private static DbConnectionFactory connFactory;

    protected myDAO() {
        myDAO.connFactory = DbConnectionFactoryHome.getHome().lookupFactory("facName");
    }

    public myReturn myAccessMethod(final int cod) throws BaseException {
        Connection conn = null;
        CallableStatement stmt = null;
        ResultSet resSet = null;
        myReturn ret= null;

        try {
            conn = myDAO.connFactory.getConnection();
            stmt = conn.prepareCall("{call name (2)}");
            stmt.setInt(1, cod);
            resSet = stmt.executeQuery();
            if (resSet.next()) {
                ret = new myReturn(resSet.getInt("someValue"));
            }
        }
        catch (SQLException sqle) {
            throw new myException(sqle.getMessage(), (Throwable)sqle);
        }
        finally {
            try {
                if (resSet != null) {
                    resSet.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            }
        }
        return ret;
    }


我应该从connFactory移除static修饰符还是实现单例,以便在再次调用构造函数时不重新创建工厂?

最佳答案

我会让您的DBConnectionFactory单身。有关如何执行此操作的一个很好的示例,请参见:Singleton DB Connectionfactory.

但是,我不确定您的问题是数据库连接工厂是静态的。实际上,这可能与您使用结果集提取结果的方式有关。确保处理所有结果。您应该包括一个更完整的堆栈跟踪。您可能想调查为什么会出现:“服务器无法恢复事务。”这里有一篇有关如何导致此错误以及如何解决此错误的文章:Failed to resume transaction

尝试做这样的事情:

CallableStatement stmt = connection.prepareCall("{call name (2)}");
stmt.setInt(1, cod);

stmt.execute();

ResultSet rs = (ResultSet)stmt.getObject(index);

//Loop results
while (rs.next()) {
  ret = new myReturn(resSet.getInt("someValue")
}

08-03 22:22