1. Was ist ein JDBC -Verbindungspool?
In herkömmlichen JDBC -Verbindungen müssen Sie jedes Mal, wenn Sie eine Verbindungsverbindung erhalten, einen komplizierten Code laden, um den folgenden Code zu erhalten:
public static Connection getConn () {Verbindung conn = null; String url = "jdbc: mysql: // localhost: 3306/test"; String user = "root"; String password = "root"; try {class.forname ("com.mysql.jdbc.driver"); conn = driverManager.getConnection (URL, Benutzer, Passwort); } catch (classNotFoundException e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } return conn; }Solche komplizierten Operationen dienen nur zum Erhalten einer Verbindung. Natürlich können wir es in eine Werkzeugklasse einkapseln, um zugreifen zu können (die obige Abbildung verringert die Verbindung der Verbindung), aber ist es eine Leistungsverschwendung, jede Verbindung zu laden? Um die Leistung zu optimieren, erscheint ein Verbindungspool.
Wenn der Verbindungspool initialisiert wird, werden mehrere Verbindungen für uns erstellt. Wenn wir eine Verbindung herstellen müssen, müssen wir nur vorhandene Verbindungen aus dem Verbindungspool erhalten. Wenn keine initialisierten Verbindungen vorhanden sind, wird eine Verbindung hergestellt. Nach der Verwendung der Verbindung wird die Verbindung nicht zerstört, sondern für die spätere Verwendung in den Verbindungspool zurückgegeben. (Natürlich ist das Verbindungsbading nicht nur so einfach, hier sind die Einführungen)
Zu den häufig verwendeten Verbindungspools gehören DBCP und C3P0. Die wichtigsten Mainstreams sind jetzt Alibabas Druid Connection Pool und Tomcats eigener JNDI -Verbindungspool.
2. Passen Sie einen einfachen Verbindungspool an
Analyse von benutzerdefinierten Verbindungspools:
1.2. Da es sich um einen Verbindungspool handelt, müssen wir die DataSource -Schnittstelle implementieren und die darin enthaltenen Methoden implementieren. Basierend auf unserer Situation geht es um die Methode von GetConnection ();
2. Da wir mehrere Verbindungsobjekte speichern möchten, verwenden wir eine Sammlung, um sie zu speichern. Basierend auf den häufigen Operationen des Hinzufügens und Löschens verwenden Sie dann die LinkedList.
3. Die Zerstörung einer Verbindung besteht nicht darin, die Verbindung zu zerstören, sondern die Verbindung zum Verbindungspool zurückzugeben.
Codierung:
1. Erstellen Sie eine Klasse mydataSource und implementieren Sie die DataSource -Schnittstelle
Wenn diese Klasse geladen ist, muss sie einen Container haben, um die Verbindung zu speichern. Definieren Sie daher eine statische Eigenschaft:
private statische Liste <Conbinsion> ConnectionList = New LinkedList <> ();
2. Da wir die Datenbankverbindung erhalten müssen, verkapulieren wir eine Methode, um die Datenbankverbindung zu erhalten.
öffentliche Verbindung getoneConnection () {Verbindung conn = null; Versuchen Sie {// Die hier erhaltenen Daten werden über die externe Eigenschaftendatei erhalten, die flexibler ist. InputStream in = mydataSource.class.getClassloader (). getResourceAsStream ("jdbc/jdbc.properties"); Eigenschaften pro = neue Eigenschaften (); pro.load (in); Driver = Pro.GetProperty ("Treiber"); url = pro.getProperty ("url"); userername = pro.getProperty ("Benutzer"); password = pro.getProperty ("Passwort"); Class.Forname (Treiber); conn = driverManager.getConnection (URL, Benutzername, Passwort); } catch (Ausnahme e) {e.getStacktrace (); } return conn; }Beachten Sie, dass die Daten, die ich über die Eigenschaftsdatei erhalten habe, gemäß der tatsächlichen Situation ausgewählt werden können.
3. Initialisieren Sie mehrere Verbindungen und legen Sie sie in den Behälter. Es kann mit statischen Codeblöcken implementiert werden. Wenn diese Datenquelle jedoch nicht verwendet wird, wird Ressourcenabfälle verursacht. Daher habe ich darüber nachgedacht, mehrere Verbindungen in seinen Konstruktor zu initialisieren, dh wenn dieser Verbindungspool erforderlich ist, werden mehrere Verbindungen entsprechend erstellt. wie folgt:
public myDataSource () {für (int i = 0; i <5; i ++) {Verbindung conn = getoneConNection (); // Ruf die Methode auf, um die ConnectionList.add (conn) zu erstellen; }}V.
@Override public Connection getConnection () löst SQLEXception {Connection conn = null aus; if (ConnectionList == NULL || ConnectionList.size () <= 0) {Connection Connection = getConnection (); ConnectionList.add (Verbindung); } conn = ConnectionList.remove (0); Conn zurückgeben; }5. Erstellen Sie eine Objektrückgabemethode und geben Sie die verwendete Verbindung in den Verbindungspool ein
public void BackConnection (Verbindung conn) {ConnectionList.add (conn); }OK, dies vervollständigt einen einfachen benutzerdefinierten Verbindungspool, und der Testcode lautet wie folgt:
public static void main (String [] args) löst SQLEXception (myDataSource dataSource = new MyDataSource () aus; Verbindung conn = dataSource.getConnection (); String SQL = "SELECT * vom Benutzer, wo u_id =?"; PrepedStatement ps = null; ResultSet rs = null; try {ps = conn.preparestatement (SQL); ps.Setint (1, 1); rs = ps.executeQuery (); while (rs.Next ()) {System.out.println ("id ="+rs.getint (1)); System.out.println ("userername ="+rs.getString (2)); System.out.println ("password ="+rs.getString (3)); }} catch (sqlexception e) {e.printstacktrace (); } endlich {dataSource.backConnection (conn); }}Weil ignorieren, gibt es in meinem Code keine anderen beiden Objekte, die sie schließen können.
Jetzt gibt es ein kleines Problem, dass unsere schließende Verbindung über die Verbindungspool -Methode erreicht wird. Wenn der Benutzer jedoch die Schließmethode des Verbindungsobjekts aufruft, wird die Verbindung zerstört und nicht zum Verbindungspool zurückgegeben. Dann optimieren wir es so, dass der Benutzer die Verbindung nicht zerstört, sondern die Verbindung zurückgibt.
Unter ihnen gibt es viele Lösungen, und hier ist ein dekoratives Modell.
Optimierung:
1. Erstellen Sie eine neue Klasse MyConnection, um die Verbindungsschnittstelle zu implementieren, wobei ihre Attributtypen Verbindungsconn und eine Liis <verbindung> sind.
private Verbindung Conn; Private List <Connection> Pool; public myConnection (Verbindung conn, list <Verbindung> Pool) {this.conn = conn; this.pool = Pool; }2. Implementieren Sie dann die schließende Methode der Schnittstelle
@Override public void close () löscht sqlexception {System.out.println ("Recycle Connection"); pool.add (conn); }3. Implementieren Sie dann die Methode zum Erhalten der Anweisung. Wenn es nicht implementiert wird, tritt bei der Erlangung dieser Anweisung ein Nullzeigerfehler auf. Ich implementiere nur die Methode zum Erhalten der vorbereiteten Angaben.
@Override public prepectStatement preparestatement (String SQL) löst SQLEXception {System.out.println ("Get Anweisung") aus; return conn.preparestatement (SQL); }4. Löschen Sie dann die Methode Backconnection der MyDataSource -Klasse, um die Verbindung zurückzugeben, und ändern Sie den Konstruktor und die Methode, um die Verbindung wie folgt zu erhalten
public mydataSource2 () {für (int i = 0; i <5; i ++) {Verbindung conn = getoneConnection (); MyConnection MyConn = New MyConnection (Conn, ConnectionList); ConnectionList.add (MyConn); }} @Override public Connection getConnection () löst SQLEXception {Connection conn = null aus; if (ConnectionList == NULL || ConnectionList.size () <= 0) {Connection Connection = getConnection (); MyConnection myConn = new MyConnection (Verbindung, Verbindungsliste); ConnectionList.add (MyConn); } conn = ConnectionList.remove (0); Conn zurückgeben; }OK, damit der Benutzer die Verbindung nicht zerstört, indem wir unsere Verbindungs -Schließmethode direkt aufrufen und sie korrekt an den Verbindungspool zurückgeben. Sie können es testen, indem Sie den Testcode ein wenig ändern.
Der obige Artikel ist der gesamte Inhalt, den ich mit Ihnen geteilt habe. Ich hoffe, es kann Ihnen eine Referenz geben und ich hoffe, Sie können Wulin.com mehr unterstützen.