Hallo Cracks,
hier eine Frage, mit der ich mich schon längere Zeit beschäftige aber nirgendwo eine vernünftige Lösung gefunden habe.
Ich habe folgenden Code:
Code:
public void update(SessionFactory sessionFactory, DualSystemLizenz lizenz){
Session hbSession=sessionFactory.openSession();
Connection conn=hbSession.connection();
PreparedStatement ps=null;
try{
ps=conn.prepareStatement("update lizenz set ist_lizensiert=? where uid=?");
ps.setBoolean(1, lizenz.getIstLizensiert());
ps.setLong(2, lizenz.getUid());
ps.executeUpdate();
ps.close();
conn.commit();
conn.close();
}catch(SQLException sqle){
logger.error("Fehler beim Ändern eines Lizenzdatensatze",sqle);
sqle.printStackTrace();
}
}
Tritt eine SQLException auf, wird in die catch-Klausel gesprungen und die Connection wird nicht geschlossen. Also wird das ganze um die finally-Klausel erweitert. Der Code sieht dann wie folgt aus:
Code:
public void delete(SessionFactory sessionFactory, DualSystemLizenz lizenz){
Session hbSession=sessionFactory.openSession();
Connection conn=hbSession.connection();
PreparedStatement ps=null;
try{
ps=conn.prepareStatement("delete from dualsystemlizenz where uid=?");
ps.executeUpdate();
ps.close();
conn.commit();
conn.close();
}catch(SQLException sqle){
logger.error("Fehler beim Löschen eines Lizenzdatensatze",sqle);
sqle.printStackTrace();
}finally{
try {
ps.close();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Was mich daran stört ist, daß ich wieder eine try-catch-Ummandelung brauche. Dies zieht den Code in die Länge und die Übersichtlichkeit leitet.
Deshalb habe ich das Schließen in eine private Methode verlagert.
Code:
public void delete(SessionFactory sessionFactory, DualSystemLizenz lizenz){
Session hbSession=sessionFactory.openSession();
Connection conn=hbSession.connection();
PreparedStatement ps=null;
try{
ps=conn.prepareStatement("delete from dualsystemlizenz where uid=?");
ps.executeUpdate();
ps.close();
conn.commit();
conn.close();
}catch(SQLException sqle){
logger.error("Fehler beim Löschen eines Lizenzdatensatze",sqle);
sqle.printStackTrace();
}finally{
closer(ps,conn);
}
}
private void closer(PreparedStatement ps, Connection conn){
try{
if(ps!=null){
ps.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLException sqle){
sqle.printStackTrace();
}
}
Nun die entscheinde Frage: "Kennt jemand eine bessere Möglichkeit?"
Übrigens könnte man, in Beiden Fällen, auf die finally-Klausel verzichten, da alle Anweisungen nach der catch-Klausel sowieso ausgeführt werden.
mfg
Anunnaki
Lesezeichen