Anzeige:
Ergebnis 1 bis 2 von 2

Thema: Wie schließe ich Datenbankverbindungen am sinnvollsten?

  1. #1
    Registrierter Benutzer
    Registriert seit
    01.12.2006
    Beiträge
    32

    Wie schließe ich Datenbankverbindungen am sinnvollsten?

    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

  2. #2
    Registrierter Benutzer
    Registriert seit
    01.12.2006
    Beiträge
    32
    Übrigens können, unter Verwendung des finally-Blocks, die close-Operationen im try-Bereich entfallen.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •