Scheitern zu Bereinigung java.sql.Anweisung auf checked Exception
In meiner Methode anzeigen unten finden Fehler ist die Angabe von Fail Bereinigung java.sql.Anweisung auf checked Exception
public int updateSecurityCodeHistoryForMessage(String phone, String securityCodeHistoryId, String messageState, String messageId, String parentMessageId)
{
CaptivePortalLogger.appLog.error(MODULE+"Start : updateSecurityCodeHistoryForMessage::"+messageState);
int result=-1;
String query=null;
Connection con = null;
PreparedStatement pstmt =null;
try
{
CaptivePortalLogger.sysOut.debug(MODULE + " (Method : isSecurityCodeUsed) Available Connection : "+ CaptivePortalDBConnection.getNumIdleConnections());
CaptivePortalLogger.sysOut.debug(MODULE + " (Method : isSecurityCodeUsed) Active Connection : "+ CaptivePortalDBConnection.getNumActiveConnections() );
con = CaptivePortalDBConnection.getDataSource().getConnection();
CaptivePortalLogger.appLog.error(MODULE+" Before updateSecurityCodeHistoryForMessage into SendMessageAndReceiveReport: ");
query="UPDATE tblsecuritycodehistory SET messagestate = ?,messageid = ? WHERE securitycodehistoryid = ? AND mobileno = ?";
CaptivePortalLogger.appLog.debug(MODULE + "for updateSecurityCodeHistoryForMessage in SendMessageAndReceiveReport Query : "+ query);
pstmt = con.prepareStatement(query);
pstmt.setString(1,messageState); //<b>line 556</b>
pstmt.setString(2,messageId);
pstmt.setString(3,securityCodeHistoryId);
pstmt.setString(4,phone);
result = pstmt.executeUpdate();
CaptivePortalLogger.appLog.error(MODULE+" After updateSecurityCodeHistoryForMessage into SendMessageAndReceiveReport: result::"+result);
}
catch (Exception e) {
result = -1;
CaptivePortalLogger.traceLog.debug("Got an exception while updateSecurityCodeHistoryForMessage in SendMessageAndReceiveReport: ",e);
}
finally
{
CaptivePortalLogger.appLog.debug(MODULE+"Finally Start");
try
{
if(pstmt!=null)
pstmt.close();
if(con !=null)
con.close();
CaptivePortalLogger.sysOut.debug(MODULE + " (Method : updateSecurityCodeHistoryForMessage) Closing connections done ....");
}
catch(Exception e)
{
CaptivePortalLogger.traceLog.debug("Error in closing sqlReader.",e);
}
}
CaptivePortalLogger.appLog.error(MODULE+"End : updateSecurityCodeHistoryForMessage");
return result;
}
Finde ich viele links auf stack, aber keiner von Ihnen in der Lage, mein problem zu lösen(vielleicht habe ich m nicht in der Lage zu verstehen Sie richtig). Jede Hilfe wird geschätzt.
Vielen Dank im Voraus..........
Nach updaing meine finally-block mit einer angegebenen Lösung von @Markus problem besteht weiterhin
finally
{
CaptivePortalLogger.appLog.debug(MODULE+"Finally Start");
try {
if(pstmt!=null)
pstmt.close();
} catch (Exception ex) {
//Log, ignore, etc
}
try {
if(con !=null)
con.close();
} catch (Exception ex) {
//Log, ignore, etc
}
CaptivePortalLogger.sysOut.debug(MODULE + " (Method : updateSecurityCodeHistoryForMessage) Closing connections done ....");
}
Nach der Verwendung von @Jon Vorschlag hat mein problem gelöst bekommen. endlich gelöst code ::
public int updateSecurityCodeHistoryForMessage(String phone, String securityCodeHistoryId, String messageState, String messageId, String parentMessageId)
{
CaptivePortalLogger.appLog.error(MODULE+"Start : updateSecurityCodeHistoryForMessage::"+messageState);
int result=-1;
String query=null;
Connection con = null;
PreparedStatement pstmt =null;
try
{
CaptivePortalLogger.sysOut.debug(MODULE + " (Method : isSecurityCodeUsed) Available Connection : "+ CaptivePortalDBConnection.getNumIdleConnections());
CaptivePortalLogger.sysOut.debug(MODULE + " (Method : isSecurityCodeUsed) Active Connection : "+ CaptivePortalDBConnection.getNumActiveConnections() );
con = CaptivePortalDBConnection.getDataSource().getConnection();
CaptivePortalLogger.appLog.error(MODULE+" Before updateSecurityCodeHistoryForMessage into SendMessageAndReceiveReport: ");
query="UPDATE tblsecuritycodehistory SET messagestate = ?,messageid = ? WHERE securitycodehistoryid = ? AND mobileno = ?";
CaptivePortalLogger.appLog.debug(MODULE + "for updateSecurityCodeHistoryForMessage in SendMessageAndReceiveReport Query : "+ query);
try
{
pstmt = con.prepareStatement(query);
pstmt.setString(1,messageState);
pstmt.setString(2,messageId);
pstmt.setString(3,securityCodeHistoryId);
pstmt.setString(4,phone);
result = pstmt.executeUpdate();
}
catch(SQLException e1)
{
CaptivePortalLogger.traceLog.debug("Error in closing sqlReader.",e1);
}
finally{
if(pstmt!=null)
pstmt.close();
}
CaptivePortalLogger.appLog.error(MODULE+" After updateSecurityCodeHistoryForMessage into SendMessageAndReceiveReport: result::"+result);
}
catch (SQLException e2) {
result = -1;
CaptivePortalLogger.traceLog.debug("Got an exception while updateSecurityCodeHistoryForMessage in SendMessageAndReceiveReport: ",e2);
}
finally
{
CaptivePortalLogger.appLog.debug(MODULE+"Finally Start");
try
{
if(con !=null)
con.close();
CaptivePortalLogger.sysOut.debug(MODULE + " (Method : updateSecurityCodeHistoryForMessage) Closing connections done ....");
}
catch(SQLException e)
{
CaptivePortalLogger.traceLog.debug("Error in closing sqlReader.",e);
}
}
CaptivePortalLogger.appLog.error(MODULE+"End : updateSecurityCodeHistoryForMessage");
return result;
}
- Sie sprechen über Firebug, finden Sie diese - sind Sie sicher, dass Sie nicht bedeuten, FindBugs? Den nur Firebug ich bewusst bin, ist eine client-side-web-Entwicklung-tool.
- Sorry Jon für irreführend, eigentlich ist es findbug, ich habe jetzt aktualisieren.(danke für die Korrektur von mir)
- ich habe nun erwähnt der geänderte code des finally-Blocks.
- Du bist immer noch nur ein einziger
finally
block. Das ist nicht das, was meine Antwort vorgeschlagen: "Sie sollten ein separates try/finally-block wird für jede Ressource". Siehe meine Antwort für weitere details.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blick auf diese code:
Nun bedenkt, dass
pstmt.close()
können eine Ausnahme auslösen... was bedeutet, dasscon.close()
würde nicht aufgerufen werden.Wenn Sie mit Java 7, mit einem try-mit-Ressourcen-Anweisung anstelle, aber ansonsten sollten Sie einen separaten try/finally-block wird für jede Ressource.
Ich würde auch stark empfehlen, gegen den Fang Decke
Exception
- es ist besser zu fangen bestimmten Ausnahmen, die kann man eigentlich handle, und lassen Sie andere Ausnahmen propagieren den Stapel. Auch, Sie scheinen zu sein, unter Verwendung der integer-Werte, um zu signalisieren Erfolg oder Misserfolg der Methode - das ist nicht idiomatischen Java; Ausnahmen sind bevorzugt für die Fehlerbehandlung im Allgemeinen.Exception
in Ihrem "einzigen finally-block" Versuch - aber andereThrowable
Werte geworfen werden konnte, in welchem Fall Sie würde immer noch nicht Aufräumen.Das problem ist, dass wenn
pstmt.close()
eine Exception wirft, dann ist die Verbindung nie geschlossen.Entweder schließen Sie nicht die Anweisung im finally - (als Treiber sind erforderlich, um in der Nähe
Statement
Objekte, wenn dieConnection
ist geschlossen), oder beide, in Ihren eigenentry..catch
-block. Eg:Firebug korrekt ist.
Sollten Sie schließen alle Ihre SQL-Ressourcen in einem finally-block, mit individuell gewickelt ruft zu schließen Methoden.
Können Sie es mit eine utility-Klasse:
Rufen Sie die close-Methode in einen finally-block in der Methode, erstellt die Ressource.
Versuchen zu bereinigen /schließen-Ressourcen in separaten try/catch/finally-block aus, sonst wenn einer eine exception werfen, dann rest wird bleiben unverschlossen.