2016-04-27 11 views
1

Ich stelle diese Frage speziell für Stateless Session Bean. Ich wusste, dass ich die DataSource mit der @Resource Annotation leicht einspritzen kann. Aber ich weiß nicht, was ist der richtige Weg, um die Connection zu bekommen. Ist es in jeder Methode der Bean oder in der Methode mit annotiert? Und auch für die Schließung der Connection. Muss ich es innerhalb des finally-Blocks in jedem Methodenaufruf oder in der mit @PreDestroy annotierten Methode schließen?Richtige Art, JDBC-Verbindung in EJB 3 (SLSB) zu behandeln

Ist es sicher, eine Instanzvariable für die Connection, zum Beispiel zu erstellen:

@Stateless 
public class MyBean { 
    @Resource private DataSource ds; 
    private Connection conn; 

    @PostConstruct 
    public void onCreate() { 
     conn = ds.getConnection(); // within try catch block 
    } 

    @PreDestroy 
    public void onDestroy() { 
     conn.close() // within try catch block 
    } 
} 

Oder sollte ich sie in jeder Methode wie folgt lokal erstellen:

@Stateless 
public class MyBean { 
    @Resource private DataSource ds; 

    public void method1() { 
     Connection conn = null; 
     // get and close connection... 
    } 

    public void method2() { 
     Connection conn = null; 
     // get and close connection... 
    } 
} 

Einige Leute im Internet mach es so, und einige andere tun das auch. Was ist die richtige Methode, die in einer Anwendung mit hohem Anforderungsverkehr implementiert werden soll? Wenn die Bean-Instanz wieder in den EJB-Pool zurückgegeben wird, bleibt die Connection geöffnet oder wird sie an den Datenbankpool zurückgegeben?

Hinweis: Die Anwendung verwendet die native JDBC-API. Es gibt keine JPA, JDO, etc .. Der Anwendungsserver ist Wildfly.

Antwort

2

TL; DR Der zweite Ansatz ist der richtige. Stellen Sie sicher, dass Sie die Verbindung schließen, um sie an den Pool zurückzugeben.

Die Datenquelle ist ein Pool von Verbindungen, jedes Mal, wenn Sie eine Verbindung erhalten, entnimmt sie eine Verbindung aus der Datenquelle und wenn Sie diese Verbindung schließen, wird sie an den Pool zurückgegeben, so dass Sie die Verbindung immer wieder freigeben möchten möglich.

In der ersten Annäherung werden Sie die Verbindung beibehalten, solange das EJB im Speicher lebt. Da die EJB eine zustandslose Bohne ist, wird sie lange leben und von verschiedenen Konsumenten wiederverwendet werden. Wenn Sie mindestens eine Verbindung pro EJB offen haben, ist diese Vorgehensweise nicht praktikabel.

Der zweite Ansatz ist der richtige. Stellen Sie sicher, dass Sie die Verbindung schließen, um sie an den Pool zurückzugeben. Bei diesem Ansatz behält die Bean die Verbindung nur während des Betriebs bei. Stellen Sie sicher, dass Sie die Verbindung schließen, um sie an den Pool zurückzugeben.

@Stateless 
public class MyBean { 
    @Resource private DataSource ds; 

    public void method1() { 
    try(Connection conn = ds.getConnection()){ 
     // Do anything you need with the connection 
    } 
    } 

    public void method2() { 
    Connection conn = ds.getConnection(); 
    try { 
     // Do anything you need with the connection 
    } finally { 
     connection.close(); 
    } 
    } 
} 
Verwandte Themen