Fragen zum MysqlConnectionPool

DannyDDD

Grünschnabel
Hallo,

ich nutze MySQL 5.1 und den JDBC 5.0.5 und möchte damit in Java (6) einen ConnectionPool aufbauen. Leider finde ich nirgendswo Optionen, was Timeouts, minimale und maximale Verbindungen angeht (für Oracle habe ich es als Methode gefunden, für MySQL nicht). Vielleicht bin ich auch ganz falsch an die Sache herangegangen:

Code:
public class TempMySQLConnectionPool
{
	private Vector<MySQLStatement> statements;
	private int maxConnections;
	private XMLSettingsReader settings;
	private MysqlConnectionPoolDataSource MySQLDataSource;

	public TempMySQLConnectionPool(XMLSettingsReader pSettings)
	{
		settings 		= pSettings;
		//maxConnections 	= 25;
		statements		= new Vector<MySQLStatement>();
		readXMLStatements("mysql_core.xml");

		MySQLDataSource = new MysqlConnectionPoolDataSource();
		MySQLDataSource.setDatabaseName("nass");
		MySQLDataSource.setPort(3306);
		MySQLDataSource.setUser("root");
		MySQLDataSource.setServerName("localhost");
	}

	public Connection getConnection() throws SQLException
	{
		return ((MysqlPooledConnection) MySQLDataSource.getPooledConnection()).getConnection();
	}


	//testen
	public static void main(String[] args)
	{
		TempMySQLConnectionPool test = new TempMySQLConnectionPool(new XMLSettingsReader("settings.xml"));

		try {
			Connection con = test.getConnection();
			Statement stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery("Select id, username, email from users;");
			ResultSetMetaData rsmd = rs.getMetaData();

			while (rs.next()) {
				for (int i = 1; i <= rsmd.getColumnCount(); i++) {
					System.out.print(rs.getString(i) + " | ");
				}
				System.out.println();
			}
		} catch (SQLException e) {
			// TODO Automatisch erstellter Catch-Block
			e.printStackTrace();
		}
	}


	public boolean readXMLStatements(String XMLFile)
	{
		// (...)
	}
}

Bei vielen Beispielen wird es ähnlich gemacht, jedoch die Abgefragte Verbindung sofort mittels close() geschlossen, was ja nicht der Sinn eines solchen Pools sein kann (oder ist in diesem Fall close die Freigabe der Connection?). Welche Rolle spielt JNDI und wann sollte man es einsetzen?

Ich wäre sehr dankbar, wenn mir das jemand etwas aufschlüsseln könnte.
 
Hallo,

welche Optionen fehlen denn da deiner Meinung nach?
Java:
MysqlConnectionPoolDataSource mysqlConnectionPoolDataSource = new MysqlConnectionPoolDataSource();
        mysqlConnectionPoolDataSource.setConnectTimeout(timeoutMs)
//...

Bei vielen Beispielen wird es ähnlich gemacht, jedoch die Abgefragte Verbindung sofort mittels close() geschlossen, was ja nicht der Sinn eines solchen Pools sein kann (oder ist in diesem Fall close die Freigabe der Connection?).
genau... nur weil close() aufgerufen wird muss ja noch lang nicht heißen, dass auch die zugrundeliegende Connection geschlossen wird. Diese wird dann wohl wieder zurück im Pool landen.

Welche Rolle spielt JNDI und wann sollte man es einsetzen?
JNDI steht für Java Naming and Directory Interface und ist eine Art Verzeichnisdienst unter Java (Bestandteil von Java EE). Darin können Objekte an Namen in einer hierarchischen Struktur gebunden und wieder aufgefunden werden. Es gibt verschiedene Provider die es beispielsweise erlauben auf einen externen Verzeichnisdienst wie ein ActiveDirectory /LDAP oder eine FileSystem basierte Variante zuzugreifen.

Gruß Tom
 
Hallo,

vielen Dank für deine Antwort. Ich konnte daraus schließen, dass JNDI also nicht zwangsläufig notwendig ist. Ich hab die Klasse noch etwas umgebaut:

Code:
public class MySQLConnectionPool
{

	private static MysqlConnectionPoolDataSource dataSource;
	private static Vector<MySQLStatement> statements;
	private static XMLSettingsReader settings;

	public static boolean init(XMLSettingsReader pSettings)
	{
		settings   = pSettings;
		statements = new Vector<MySQLStatement>();
		dataSource = new MysqlConnectionPoolDataSource();
		dataSource.setUser(settings.getMysqlUsername());
		dataSource.setPassword(settings.getMysqlPassword());
		dataSource.setURL(settings.getMysqlURL());
		return readXMLStatements("mysql_core.xml");
	}

	public static Connection getConnection() throws NamingException, SQLException
    {
		return dataSource.getPooledConnection().getConnection();
    }
	// (...)
}

Damit klappts schon ganz gut. Die Timout-Einstelung habe ich schlichtweg übersehen, aber wie siehts mit Optionen wie minimale und maximale Connections zur DB aus? Für Oracle Datenbanken sind diese direkt als Methoden verfügbar - für MySQL scheinbar nicht. Aber irgendwo muss man es doch einstellen können, oder nicht?

Mit freundlichem Gruß
 
Die Frage nach der Anzahl der minimalen und maximalen Zahl der Connections beschäftigt mich auch gerade, aber ich finde dazu nichts (benutzte PostgreSQL)...
 
Zurück