2016-05-03 77 views
0

執行SQL語句時數據訪問對象類越來越SQLServerException

SQLServerException我得到以下execption:服務器無法恢復交易。 Desc: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修飾符或實施單,所以當構造函數被調用再次工廠沒有重現?

回答

1

我會讓你的DBConnectionFactory一個單身人士。如何做到這一點的一個很好的例子可以在這裏找到:Singleton DB Connectionfactory.

但是,我不知道你的問題是與db連接工廠是靜態的。它可能實際上是你用結果集提取結果的方式。確保處理所有結果。 您應該包含更完整的堆棧跟蹤。您可能想要了解爲什麼得到:「服務器無法恢復交易」。關於什麼如何導致此錯誤,以及如何在這裏解決它的一篇文章: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") 
} 
+0

我明白,我需要調用在另一份聲明之前處理所有結果相同的連接,但在這種情況下,只能在同一個連接中調用一條語句。 – dinhokz

+0

當你得到錯誤時,你可以發佈更多的堆棧跟蹤嗎? – Brod