2016-05-03 6 views
0

Ich erhalte die folgende execption wenn SQL-Anweisungen ausführenData Access Object-Klasse SQLServerException bekommen

SQLServerException: Der Server hat die Transaktion fortzusetzen fehlgeschlagen. Beschreibung: 69d00000016.

Ich weiß, dass die folgende DAO-Implementierung nicht korrekt ist. Ich möchte wissen, was die richtige Implementierung für den folgenden Code ist und ob die Tatsache, dass meine ConnFactory als statisch deklariert ist, den obigen Fehler verursachen kann.

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; 
    } 

Soll ich den statischen Modifikator aus der connFactory entfernen oder einen Singleton implementieren, so dass, wenn der Konstruktor erneut aufgerufen wird das Werk neu erstellt wird nicht?

Antwort

1

Ich würde Ihre DBConnectionFactory ein Singleton machen. Ein gutes Beispiel dafür finden Sie hier: Singleton DB Connectionfactory.

Ich bin mir jedoch nicht sicher, dass das Problem mit der statischen Verbindung der db connection factory ist. Es kann tatsächlich mit der Art sein, wie Sie Ergebnisse mit der Ergebnismenge extrahieren. Stellen Sie sicher, dass Sie alle Ihre Ergebnisse verarbeiten. Sie sollten eine vollständigere Stack-Trace enthalten. Sie können überprüfen, warum Sie erhalten: "Der Server konnte die Transaktion nicht fortsetzen." Es gibt einen Artikel darüber, wie, was diesen Fehler verursacht und wie man es beheben hier: Failed to resume transaction

Probieren Sie etwas wie dies zu tun:

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

ich verstanden, dass ich alle Ergebnisse zu verarbeiten, bevor eine weitere Erklärung in der anruf gleiche Verbindung, aber in diesem Fall kann nur eine Anweisung in derselben Verbindung aufgerufen werden. – dinhokz

+0

Können Sie mehr von Ihrem Stack-Trace veröffentlichen, wenn Sie den Fehler erhalten? – Brod