Wie man eine DB-Verbindung von einem in JBoss geöffneten Verbindungspool korrekt hält

Ich benutze JBoss AS 7.1 als Server und ich habe meine DataSource mit Pooling konfiguriert. Ich bin ziemlich neu, also bitte entschuldigt alle Anfängererrors … schließlich bin ich hier um zu lernen.

Wenn sich ein Client anmeldet, erhält er eine Verbindung zur database, und ich muss diese Verbindung (aus dem Pool) offen halten, bis sich der Benutzer abmeldet oder die HttpSession abläuft. Dies ist eine absolute Anforderung, die von unserem DB Admin kommt. wer sagt, dass er die DB-Sitzungsvariablen benötigt. Ich benutze ein Servlet für all dies.

Ich habe mit den Möglichkeiten gespielt, mit denen ich zwei große Probleme hatte:

  1. Soweit ich sehe, schließt JBoss unbenutzte Verbindungen automatisch => meine geöffnete Verbindung kehrt zum Pool zurück. Das könnte also nicht der richtige Weg sein.

  2. Wenn ich versuche, das Connection-Objekt wie folgt zu speichern / abzurufen :

    private Hashtable connections = new Hashtable(); try { String strDSName1 = "java:/OracleDSJNDI"; ctx = new InitialContext(); ds1 = (javax.sql.DataSource) ctx.lookup(strDSName1); System.out.println("Got 1'st ds."); } catch (Exception e) { System.out.println("ERROR getting 1'st DS : " + e); } connection = ds1.getConnection(); connections.put(session.getId(), connection); conn = (Connection) connections.get(sessionID); 

    Es triggers diese Ausnahme aus:

    java.sql.SQLException: Verbindung ist keiner verwalteten Verbindung zugeordnet.org.jboss.jca.adapters.jdbc.jdk6.WrappedConnectionJDK6@dee1f37

Meine Frage ist: Wie kann ich meine Verbindung richtig halten?

Vielen Dank

Wie kann ich meine Verbindung ordnungsgemäß aufrechterhalten?

Sie müssen das nicht tun, lassen Sie den Verbindungspool dies behandeln.


Hinter den Kulissen hält der Verbindungspool eine Reihe von databaseverbindungen zum databasemodul (MySQL, Oracle, SQL Server … hängt davon ab, wie Sie ihn konfigurieren) im SLEEPING Zustand. Wenn Sie diesen Code ausführen:

 //avoiding all the particular exceptions just for code simplicity purposes... //in real world applications, you must handle each of these exceptions public Connection getConnection() throws Exception { ctx = new InitialContext(); ds1 = (javax.sql.DataSource) ctx.lookup(strDSName1); return ds1.getConnection(); } 

Sie bitten den Verbindungspool, eine dieser verfügbaren Verbindungen abzurufen. Der Verbindungspool wird Ihnen eine databaseverbindung geben (falls verfügbar) und Sie können sie so lange verwenden wie Sie möchten. Dann benutzt du es wo immer du willst / brauchst und schließe es :

 public void foo() throws Exception { Connection connection = getConnection(); //do what you want/need... //in the end, you close the connection //this is A MUST! connection.close(); } 

Wenn Sie connection.close() von einer Verbindung ausführen, connection.close() vom Verbindungspool abgerufen wurde, schließen Sie nicht die physische databaseverbindung, sondern benachrichtigen den Verbindungspool. Diese bestimmte databaseverbindung muss in den SLEEPING Zustand zurückkehren.


Einige Ratschläge aus der Erklärung:

  • Sie dürfen nicht versuchen, die Verbindung aufrecht zu erhalten, das ist die Aufgabe des Verbindungspools.
  • Sie dürfen nicht versuchen, die Verbindungen in einer Cache- ähnlichen Struktur zu speichern, das ist der Job des Verbindungspools.
  • Sie müssen eine java.sql.Connection in dem kürzesten scope java.sql.Connection den Sie benötigen. Sobald Sie es benutzt haben, schließen Sie es.

Ihr DBA erfordert grundsätzlich, dass Sie das Verbindungs-Pooling vermeiden, indem Sie die databaseverbindung der Sitzung des Benutzers gleichsetzen.

Eine Option besteht also darin, den Verbindungspool nicht zu verwenden und stattdessen eigene functionen zu rollen, die die databaseverbindung um die Benutzersitzung öffnen / schließen. Das scheint jedoch kompliziert und ungewöhnlich.

Eine weitere Option ist die Überprüfung der DBA-Anforderung. Der databaseadministrator muss sich möglicherweise an die Idee anpassen, dass er den Status auf andere Weise verfolgen muss, z. B. indem er einen mit der Sitzung verknüpften Schlüssel verwendet, um den benötigten Status in einer Tabelle zu speichern, anstatt den Status in der Verbindungsebene zu speichern.

Im Allgemeinen fügt das Speichern des Zustands in der Sitzungsbehandlung einer Komponente eine indirekte Komplexität hinzu, da Sie sich darum kümmern müssen, wie die Komponente Ablauf und Eindeutigkeit behandelt, da Sie hier feststellen, dass der HTTP-Sitzungsstatus dies anders behandelt als die databasesitzung.