2016-08-06 41 views
1
static void clean() throws Exception { 
    final UserTransaction tx = InitialContext.doLookup("UserTransaction"); 
    tx.begin(); 

    try { 
    final DataSource ds = InitialContext.doLookup(Databases.ADMIN); 
    Connection connection = ds.getConnection();//line 1 
    connection = ds.getConnection(); //line 2- call again for testing purpose 
    PreparedStatement st = connection.prepareStatement("xxxxxxx sql script"); 
    st.executeUpdate(); 
    st.close(); 
    connection.close(); 
    tx.commit(); 
    } finally { 
    if (tx.getStatus() == Status.STATUS_ACTIVE) { 
     tx.rollback(); 
    } 
    } 
} 

Ich versuche DataSource.getConnection() und DataSourceUtils.getConnection(DataSource) zu vergleichen, nach dem Javadoc, die erste bekommt immer eine neue Verbindung und zweiter immer eine aktuelle Verbindung, die binden bekommen der aktive UserTransaction (im aktuellen Thread).Usertransaction mit DataSource.getConnection() und DataSourceUtils.getConnection

sah ich die obigen Beispielcode, ich verstehe nicht, wie das Beispiel kommen DataSource.getConnection verwenden, die auf meinem Verständnis basiert, wir immer DataSourceUtils.getConnection(DataSource) anstelle anderer verwenden sollten, weil wir das ganze Stück von Skripten in ein begehen wollen Verbindung statt mehr als eine Verbindung. (korrigieren Sie mich, wenn ich falsch liege)

Ich verstehe nicht warum, also fügte ich eine doppelte Zeile zu testen (Zeile 2), kann jemand erklären, wie diese Sache im Hintergrund arbeiten, wenn es ohne Linie 2 und mit Linie 2? Was ist der Unterschied?

Edited

Basierend auf dem Javadoc, DataSource.getConnection() nicht einmal in der Lage ist, die Verbindung zum aktiven Usertransaction zu befestigen, wie funktioniert die UserTransaction intern die Verbindung des Set autoCommit(false)?

Antwort

0

Ich habe eine ähnliche Frage, die bereits in here beantwortet.

Solange der Aufruf innerhalb des Transaktionskontexts ist und wir DataSource verwenden, um die Verbindung zu erhalten, ist es intelligent genug, immer die einzige aktive Verbindung zurückzugeben. Ich denke, es hängt mit der Implementierung des Transaktionsmanagers und der DataSource zusammen, die ich für meinen Fall aus Weblogic über JNDI bezogen habe.