我在执行sql语句时获得以下执行
SQLServerException:服务器无法恢复事务。 说明:69d00000016
我知道以下DAO实现不正确。我想知道以下代码的正确实现是什么,如果我的connFactory声明为static会导致上述错误。
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修饰符还是实现单例,那么当再次调用构造函数时,不会重新创建工厂?
答案 0 :(得分:1)
我会让您的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")
}