Zuviele DB Connection

Status
Nicht offen für weitere Antworten.

sence

Bekanntes Mitglied
Hallo,

ich habe bei meinem Web projekt ein Connectionpool für die DB Verbindungen eingebaut.

Java:
package database;

import java.sql.*;
import java.util.*;

/**
 * Diese Klasse reserviert, recyclet und regelt die 
 * Datenbankverbindungen über das Speichern der 
 * verschiedenen Connects in Vectoren
 */

public class ConnectionPool implements Runnable 
{
	/** Enthält den Datenbanktreiber */
	private String driver;
	
	/** Enthält die Datenbankurl */
	private String url;
	
	/** Enthält dem Usernamen für die Datenbank */
	private String username;
	
	/** Enthält das Passwort für die Datenbank */
	private String password;
	
	/** Enthält die maximale Anzahl der DbConnections */
	private int maxConnections;
	
	/** Gibt an ob über einen Thread auf freie Connections gewartet
	 * werden soll, oder eine SQL Exception geworfen wird, wenn alle
	 * Connects belegt sind
	 */
	private boolean waitIfBusy;
	
	/** Enthält die verfügbaren Connections */
	private Vector availableConnections;
	
	/** Enthält die Verbindungen, die in Betrieb sind */
	private Vector busyConnections;
	
	/** 
	 * Gibt an, ob im Hintergrund Connects gebildet werden sollen
	 * oder nicht
	 */
	private boolean connectionPending = false;

	public ConnectionPool(String driver, String url,
						String username, String password,
						int initialConnections,
						int maxConnections,
						boolean waitIfBusy)
	  throws SQLException
	  {
		this.driver = driver;
		this.url = url;
		this.username = username;
		this.password = password;
		this.maxConnections = maxConnections;
		this.waitIfBusy = waitIfBusy;
		
		if (initialConnections > maxConnections) 
		{
	  		initialConnections = maxConnections;
		}
		
		availableConnections = new Vector(initialConnections);
		busyConnections = new Vector();
		for(int i=0; i<initialConnections; i++) 
		{
	  		availableConnections.addElement(makeNewConnection());
		}
  	}

	/**
	 * Wenn eine Connection aus der Liste geschlossen ist
	 * oder ueber einen Timeout beendet, wird die Connection aus
	 * der Liste der gerade benutzten Connection entfernt und 
	 * evtl. wartende Threads werden benachrichtigt, dass jetzt
	 * wieder eine Connection frei ist, falls das maximale Limit
	 * an Connections bereits erreicht wurde
	 * @return Connection Der eigentliche Connect zur Datenbank
	 * @throws SQLException
	 */
	public synchronized Connection getConnection()
	throws SQLException 
	{
		if (!availableConnections.isEmpty()) 
		{
	  		Connection existingConnection = (Connection)availableConnections.lastElement();
	  		int lastIndex = availableConnections.size() - 1;
	  		availableConnections.removeElementAt(lastIndex);
			
			if (existingConnection.isClosed()) 
			{
				notifyAll(); // Freed up a spot for anybody waiting
				return(getConnection());
	  		} else 
	  		  {
				busyConnections.addElement(existingConnection);
				return(existingConnection);
	  		}
		} else
		  {
		
		/* Hier gibt es drei moegliche Faelle:
		 * 1. Die Anzahl maximaler Connections ist erreicht
		 *  und es wird eine neue im Hintergrund eingerichtet,
		 * 
		 * 2.  Die Anzahl maximaler Connections ist erreicht und der waitifBusy
		 * Flag steht auf false. Die SQL Exception geworfen.
		 *  
		 * 3. Die Anzahl maximaler Connections ist erreicht, aber der waitifBusy
		 * flag steht auf true. Dann wird gewartet, bis eine Connection frei
		 * ist.
		 */
	  	if ((totalConnections() < maxConnections) &&
		!connectionPending) 
		{
			makeBackgroundConnection();
	  	} else if (!waitIfBusy)
	  	  {
			throw new SQLException("Connection limit reached");
	  	  }
	  	  
		try 
		{
			wait();
	  }catch(InterruptedException ie) {}
	  	return(getConnection());
	 }
  }
	
	/**
	 * Ein Connect zur Datenbank kann nur hergestllt werden
	 * wenn eine Verbindung frei ist. Deshalb wird hier
	 * ein Thread gestartet, der eine Verbindung im 
	 * Hintergrund herstellt und dann auf eine freie Verbindung
	 * bzw. eine Nachricht wartet, dass eine Verbindung 
	 * freigegeben wurde.
	 */
	private void makeBackgroundConnection() 
	{
		connectionPending = true;
		try
		{
			Thread connectThread = new Thread(this);
	  		connectThread.start();
		} catch(OutOfMemoryError oome) 
		{
			System.out.println("Fehler in database.ConnectionPool: " + oome.getMessage());
		}
  }

	public void run()
	{
		try
		{
			Connection connection = makeNewConnection();
	  		synchronized(this)
	  		{
				availableConnections.addElement(connection);
				connectionPending = false;
				notifyAll();
	 	 }
		 } catch(Exception e) 
		 {
		 	System.out.println("Fehler in database.ConnectionPool run(): " + e.getMessage());
		 }
	}


	/**
 	* Stellt den eigentlichen Connect zur Datenbank her.
 	* @return Connection Die Datenbankverbindung
 	* @throws SQLException
 	*/
  	private Connection makeNewConnection()
	  throws SQLException 
	  {
	 	try 
	 	{
		// DbTreiber laden  
	  	Class.forName(driver);
	  
	  	// Netzwerkverbindung zur Datenbank herstellen
	  	Connection connection = DriverManager.getConnection(url, username, password);
	  	return(connection);
		}catch(ClassNotFoundException cnfe) {
	  	// Exception werfen, falls der Treiber nicht gefunden werden kann
	  	throw new SQLException("Can't find class for driver: " +
							 driver);
		}
  	}

	/**
	 * Hier werden Connections frei gegeben und aus dem busyConnections Vector
	 * rausgenommen, um beim Vector für freie Connects (availableConnections)
	 * eingefügt zu werden
	 * @param connection Die augenblickliche Connection
	 */
	public synchronized void free(Connection connection) 
	{
		busyConnections.removeElement(connection);
		availableConnections.addElement(connection);
		// Allen Threads Bescheid sagen, dass ein Connect frei geworden ist
		notifyAll();
  	}
	
	/**
	 * Gibt die Anzahl aller Connections zurück
	 * @return int Die Anzahl der Connection im Vector
	 */
	public synchronized int totalConnections()
	{
		return(availableConnections.size() +
		   busyConnections.size());
	}

  /**
   * Bietet die Moeglichkeit, alle Connections explizit zu schliessen.
   * Dies Funktion ist aber mit Vorsicht zu geniessen, wenn noch 
   * Connects zur Datenbank bestehen. Auserdem werden die ja 
   * automatisch geschlossen, wenn der GC laeuft. 
   * Die Funktion bietet jedoch die Moeglichkeit, einer groesseren 
   * Kontrolle.
   */
  public synchronized void closeAllConnections() 
  {
	closeConnections(availableConnections);
	availableConnections = new Vector();
	closeConnections(busyConnections);
	busyConnections = new Vector();
  }

  /**
   * Wird von closeAllConnections() automatisch aufgerufen
   * und ist deshalb privat
   * @param connections Die Anzahl der Verbindungen
   */
  private void closeConnections(Vector connections) 
  {
	try {
	  for(int i=0; i<connections.size(); i++) {
		Connection connection =
		  (Connection)connections.elementAt(i);
		if (!connection.isClosed()) 
		{
		  connection.close();
		}
	  }
	} catch(SQLException sqle) 
	{
	 	System.out.println("Fehler in database.ConnectionPool: " + sqle.getMessage());
	}
  }

  /**
   * Debug Ausgabe für alle Objektparameter
   * @see java.lang.Object#toString()
   */
  public synchronized String toString() {
	String info =
	  "ConnectionPool(" + url + "," + username + ")" +
	  ", available=" + availableConnections.size() +
	  ", busy=" + busyConnections.size() +
	  ", max=" + maxConnections;
	return(info);
  }
}

dort wo ich ein Object benötige hole ich mir ein Connect wie folgt:
Java:
String dbDriver = "secret";
String dbUrl = "secret";
String dbUser = "secret";
String dbPass = "secret";
	  		CON = new ConnectionPool(dbDriver,dbUrl,dbUser,dbPass,5,10,true);
	  		// Den eigentlichen Connect herstellen
	  		connect = CON.getConnection();
connect.executeQuery("TEXT");

ich schließe die connection, sobald ich diese nicht mehr benötige, jedoch gibt es folgende Probleme:

A) Es werden sehr schnell mehr als nur die max anzahl an db Connect
, also mehr als 10, obwohl die geschlossen sind.
UND wenn ich ein Statement mache, sehe ich im sql aber gleich 12 oder mehr SQL Querys (Mysql Admin)

B) wenn ich mansche Connects schließe, komme ich auf einer anderen Seite nicht weiter, deshalb muss ich ihn offen lassen, obwohl kein connect per Parameter an eine funktion oder ähnliches übergeben wird, wofür er den brauchen könnte. oO

C)
würde ich dies gerne mit einer Datasource und der context.xml realisieren, jedoch nicht im Tomcat selber, da dies dann zu gebunden ist an den Tomcat.
Hat jemand eine schnelle implementierung ggf dafür ?

vielen herzlichen Dank!
 
Zuletzt bearbeitet:

tfa

Top Contributor
Warum selber programmieren? Das gibt's doch alles schon: Apache DBCP, C3PO.
 

sence

Bekanntes Mitglied
Hey, jo die sind aber leider wie ich lese in der Server.xml aufzunehmen, aber wenn ich das projekt nun nicht unter tomcat deploye, da ich eine unabhänige benötige, da diese für weitere Webseiten auch verwendet wird, und nicht weiß auf welchem Server der Kunde das Projekt deployen möchte, sollte es intigriert sein

greets
 
M

maki

Gast
Hey, jo die sind aber leider wie ich lese in der Server.xml aufzunehmen
Da hast du dich verlesen ;)

Man kann natürlich Tomcat auch eine Pooled DS verwalten lassen, aberjede webapp kann auch ihr eigenes Ding machen.

Jedenfalls wäre es mehr als überflüssig einen eigenen CP zu bauen..
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Maxim6394 EclipseLink + SQLite | Unable to acquire a connection from driver [null] Datenbankprogrammierung 6
J PC-Start Problem JDBC Connection Datenbankprogrammierung 10
S Oracle DB-Connection in .jar file ändern Datenbankprogrammierung 11
yakazuqi MySQL MySQL Connection reset Datenbankprogrammierung 7
K Glassfish 4.1.1 Connection Pool u. Resource Ref Datenbankprogrammierung 20
OnDemand Hikari Pool Connection Validation Datenbankprogrammierung 18
Dimax MySQL Methodenaufruf mit Connection Übergabe Datenbankprogrammierung 8
D MySQL Connection richtig herstellen. Wie ? Datenbankprogrammierung 7
D Multiple Connection mit MySQL Datenbankprogrammierung 4
S Connection Pool Hikari Datenbankprogrammierung 7
P MySQL Connection Global Datenbankprogrammierung 13
J Connection Datenbankprogrammierung 1
F Brauche dringend Hilfe Java-Access Connection Datenbankprogrammierung 3
S New Connection Wizard / NetBeans Datenbankprogrammierung 0
P Frage zu Connection.close() Datenbankprogrammierung 4
T NoSQL Connection für die Thesis [GWT] Datenbankprogrammierung 1
M Connection erstellen Datenbankprogrammierung 1
F Monitoring DB Connection Pool Datenbankprogrammierung 3
H JDBCODBC - Connection-Objekt Datenbankprogrammierung 3
E MySQL SQL - wann connection schließen Datenbankprogrammierung 2
R HSQLDB Connection refused Datenbankprogrammierung 2
B JDBC Connection Fehler Datenbankprogrammierung 8
B JDBC-Connection: Data source name too long Datenbankprogrammierung 3
crashfinger jdbc-connection mit jre7 funktioniert nicht Datenbankprogrammierung 5
reibi Derby/JavaDB Connection refused Datenbankprogrammierung 14
S Ressourcenverbrauch Connection Open/Close Datenbankprogrammierung 11
W MySQL-Connection-Objekt übergeben Datenbankprogrammierung 2
N SQL-Connection Datenbankprogrammierung 3
B MySQL Datenbank Connection als String zurückgeben Datenbankprogrammierung 7
M Connection Pooling Datenbankprogrammierung 7
B MySQL Fehler: Cannot open connection mit Tomcat7, Hibernate und MySQL Datenbankprogrammierung 4
K Connection - möglich & nicht möglich Datenbankprogrammierung 2
T Datenbank connection mit Servlet Datenbankprogrammierung 4
S Applet stucks at SQL Connection (jTDS JDBC) Datenbankprogrammierung 15
c_sidi90 JDBC Oracle Connection schlägt fehl Datenbankprogrammierung 2
H H2 H2-Connection bei WebStart Datenbankprogrammierung 6
JavaKaffee Derby/JavaDB Quartz-WebAnwendung - Connection/Treiber Problem Datenbankprogrammierung 47
ruutaiokwu jdbc connection als singleton Datenbankprogrammierung 11
S Wie überprüfe ich ob die Instanz einer Connection gerade werwendet wird? Datenbankprogrammierung 4
X Connection schließen oder speichern? Performance Frage Datenbankprogrammierung 7
C Derby/JavaDB JavaDB: Keine Connection Datenbankprogrammierung 7
T Pooled Connection und Connection Pool Datenbankprogrammierung 2
S Java Connection to MySQL Datenbank FunPic Datenbankprogrammierung 4
Q java.lang.NullPointerException connection = null Datenbankprogrammierung 13
N Connection bleibt null Datenbankprogrammierung 7
H DB-Connection zu MySQL Datenbankprogrammierung 12
D Wie bekommt man die JDBC connection zum laufen?(Eclipse) Datenbankprogrammierung 16
T MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde? Datenbankprogrammierung 3
B db2 jdbc connection Datenbankprogrammierung 4
G MySQL Connection Problem Datenbankprogrammierung 3
R sql.Connection vs. mysql.Connection Datenbankprogrammierung 3
R Connection Pooling - Tote Verbindungen Datenbankprogrammierung 5
S Connection Pool Datenbankprogrammierung 23
P JPA Connection dynamisch hinzufügen Datenbankprogrammierung 2
S JDBC connection open Datenbankprogrammierung 3
D MySQL Verständnisproblem mit globalen Variablen (Connection) Datenbankprogrammierung 7
F Connection refused: connect Bei Verbindungsherstellung zu MySQL Datenbank Datenbankprogrammierung 3
R Connection Problem für eine externe DB mit Java (JDBC) Datenbankprogrammierung 9
R Connection nur als root Datenbankprogrammierung 3
N Connection kann nicht geschlossen werden!? Datenbankprogrammierung 4
S JPA Hibernate: "The user must supply a jdbc connection" Datenbankprogrammierung 4
F MySQL - Connection JDBC-Driver Problem Datenbankprogrammierung 4
E MSSQL-Server connection aufbau sehr langsam Datenbankprogrammierung 2
A Connection Variable in anderer Klasse verwenden -> statement Datenbankprogrammierung 2
S Connection String MS Access mit Systemdatenbank / Arbeitsgruppeninformationsdatei Datenbankprogrammierung 4
R DB-Connection, aber wie? Datenbankprogrammierung 2
F Java SQL Connection mit Rollback Datenbankprogrammierung 2
P DB- Connection lösen Datenbankprogrammierung 7
padde479 Connection String Oracle Datenbankprogrammierung 5
W JDBC Connection isValid()? Datenbankprogrammierung 4
G Frage zu connection? Datenbankprogrammierung 9
G allgemeine JDBC-Connection Frage Datenbankprogrammierung 2
H Wie kann ich eine Datenbank Connection aus XML-Datei lesen! Datenbankprogrammierung 2
J jdbc Oracle Connection refused Datenbankprogrammierung 6
D Probleme mit mysql-Connection Datenbankprogrammierung 10
K Wo "Connection" Object erstellen? Datenbankprogrammierung 7
N Kleine Frage zu Connection Pooling mit DataSource Datenbankprogrammierung 2
M Hilfe - keine Connection zur DB Datenbankprogrammierung 4
G Connection zu einer Oracle DB erstellen Datenbankprogrammierung 8
K Oracle XE Connection Problem Datenbankprogrammierung 2
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
G SQL Server Connection Datenbankprogrammierung 12
K "Connection timed out: connect" bei MySQL-Verbindu Datenbankprogrammierung 10
R Warum ist meine Connection null? Datenbankprogrammierung 6
B Connection Pools Datenbankprogrammierung 3
U Connection läuft nicht als jar Datenbankprogrammierung 6
R Interessantes Problem mit Connection-Pool. Datenbankprogrammierung 2
C Statement/Connection SQLWarning Datenbankprogrammierung 4
P Connection problems Datenbankprogrammierung 15
J Keine Connection zur MySQL Db Datenbankprogrammierung 6
K db connection wann schließen Datenbankprogrammierung 4
W Problem bei Connection mit SQLServer-Datenbanke mittels Java Datenbankprogrammierung 2
S Viele Klassen sollen eine Connection benutzen Datenbankprogrammierung 3
K Connection error Datenbankprogrammierung 18
G SQLException: No operations allowed after connection closed Datenbankprogrammierung 2
T problem mit mysql connection Datenbankprogrammierung 6
H Connection Pool + Tomcat + Oracle10g Datenbankprogrammierung 7
T JDBC Connection refused Problem Datenbankprogrammierung 6
L DB2 connection problem Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben