2016-04-21 12 views
1

Da ich einige Fragen haben, die einfach sind, und einige, die spezielle Operationen erfordern, in meinem Projekt verwende ich JDBI Object api mit der Flüssigkeit Syntax gemischt, zusammen mit seinem onDemand Funktionalität wie so:Mit JDBIs OnDemand-Syntax muss ich Handles schließen?

public abstract class MyDAO implements GetHandle { 

    @SqlQuery("SELECT anInt FROM aTable;") 
    public abstract int getAnInt(); 

    public List<Integer> insertThings(List<Thing> things) { 

     Handle h = getHandle(); 

     PreparedBatch batch = h.prepareBatch("INSERT INTO thingsTable (a, b) VALUES (?, ?)"); 

     for (Thing thing : things) { 
      batch.add(things.getA(), thing.getB()); 
     } 

     List<Integer> ids = batch.executeAndGenerateKeys(IntegerColumnMapper.WRAPPER).list(); 

     h.close(); 

     return ids; 
    } 
} 

//Elsewhere in my code 

MyDAO dao = jdbi.onDemand(myDAO.class); 

dao.insertThings(things); 

So Meine Frage ist, wenn ich JDBI auf diese Weise benutze, muss ich sicherstellen, dass ich meinen Handle schließe, wie ich in dem Beispiel bin, oder kümmert sich das onDemand um das Schließen wie in den abstrakten Methoden?

Antwort

1

Sie müssen den Griff nicht schließen, wenn Sie onDemand verwenden.

Aus der Dokumentation:

Die letzte Methode für eine SQL-Objektinstanz zu erhalten wird erhalten und Release-Verbindung automatisch, wie es muss. Im Allgemeinen bedeutet dies, dass es eine Verbindung erhält, um eine Anweisung auszuführen und sie dann sofort freizugeben. Verschiedene Dinge wie offene Transaktionen oder iteratorbasierte Ergebnisse führen jedoch dazu, dass die Verbindung offen bleibt, bis entweder die Transaktion abgeschlossen oder das iterierte Ergebnis vollständig durchlaufen wird.

finden Sie am Ende dieser Seite: http://jdbi.org/sql_object_overview/

+0

Das ist, was ich dachte, meine Sorge war nur da, dass ich außerhalb der üblichen Strömung den Griff zu öffnen, dass ich es selbst auch schließen hätte . –