MySQL Abfragen blockiern den Arbeitsspeicher

Status
Nicht offen für weitere Antworten.

schmuck.m

Mitglied
Hallo,

ich habe das Problem das meine Abfragen auf eine MySQL auf dauer meinen ganzen Arbeitsspeicher belegen und nicht wieder freigeben.

Eine einzelne Abfrage ist nicht das Problem, nur greift sich das Programm nach der Abfrage ca 200kb des RAM und gibt diesen nicht mehr her. Dementsprechend nach relativ wenigen Abfragen ist der ganze Abeitsspeicher belegt und ich bekomme eine "java.lang.OutofMemoryError: Java heap space" Exception.

Mein Programm läuft als Servlet in einem Tomcat 5.5 Server. Die Connection zur Datenbank halte ich in einer statischen Klasse vor, welche ich mir immer mit "getInstance" hole.


Wo hat sich hier der (logische ?!?) fehler versteckt? Ich dachte eigentlich das ich die Datenbankverbindung immer aufrecht erhalte eigentlich Speicher und Rechenzeit einspaare.



Hier mal zur Verdeutlichung meine Datenbank - Klasse:

Code:
package de.msis.EasyServer.Database.toolbox;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import de.msis.EasyServer.ControlCenter.EasyControlCenter;
import de.msis.toolbox.XmlConfig;


public class DBConnector {

	private static DBConnector mysql = null;

	private XmlConfig config = null;
	
	private String url = null;
	private String usr = null;
	private String pwd = null;
	private String classname = "com.mysql.jdbc.Driver";
	private Connection connection = null;
	
	
	
	private DBConnector() {
		config = new XmlConfig("./conf/mysql.xml");
		url = "jdbc:mysql://" + config.getConfigValue("mysql", "host") + ":3306/" + config.getConfigValue("mysql", "libary");
		usr = config.getConfigValue("mysql", "user");
		pwd = config.getConfigValue("mysql", "passwd");
		
		try {
			Class.forName(classname);
			connection = DriverManager.getConnection(url, usr, pwd);
		} catch (SQLException e) {
			e.printStackTrace();
			EasyControlCenter.getInstance().saveLog("mysql", e);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			EasyControlCenter.getInstance().saveLog("mysql", e);
		}
		
		
	}

	public static synchronized DBConnector getInstance() {
		if ( mysql == null ) mysql = new DBConnector();
		return mysql;
	}	
	
	public Connection getConnection() {
		return connection;
	}

	public ResultSet query(String die_frage) {

		try {
			Statement stmt = connection.createStatement();
			ResultSet rs = stmt.executeQuery(die_frage);
			return rs;
		} catch (Exception e) {
			e.printStackTrace();
			EasyControlCenter.getInstance().saveLog("mysql", e);
		}
		return null;
	}
	


	public void execute(String die_bitte) {
		try {
			Statement stmt = connection.createStatement();
			stmt.execute(die_bitte);
		} catch (Exception e) {
			e.printStackTrace();
			EasyControlCenter.getInstance().saveLog("mysql", e);
		}

	}

	public String getMaxId(String tblName, String idField) {
		ResultSet res = this.query("SELECT max(" + idField + ") AS maxid FROM " + tblName);
		try {
			while (res.next()) {
				return res.getString("maxid");
			}
		} catch (Exception e) {
			e.printStackTrace();
			EasyControlCenter.getInstance().saveLog("mysql", e);
		}

		return null;
	}

	
}

wenn ich nun etwas abfragen möchte arbeite ich so:

Code:
...
DBConnector db = DBConnector.getInstance();
ResultSet rs = db.query("select * from blablub");
...
 

DP

Top Contributor
jo,

wenn du mit dem resultset fertig bist, dann muss ein

rs.close();
stmt.close();
con.close();

gesetzt werden, sonst bleibt mit dem con deine connection immer offen...
 

Murray

Top Contributor
DP hat gesagt.:
wenn du mit dem resultset fertig bist, dann muss ein

rs.close();
stmt.close();
con.close();

gesetzt werden, sonst bleibt mit dem con deine connection immer offen...

Das sollte das Speicherproblem beseitigen, allerdings sollte hier ja eigentlich die Connection absichtlich gehalten werden; durch den DBConnector-Singleton sollte sichergestellt sein, dass es nur ein Connection-Objekt gibt. Wenn man das mit close() freigibt, dann funktioniert der Code nur noch einmal.

Das ResultSet und das Statement sollten eigentlich automatisch geschlossen werden, wenn die entsprechenden Objekte collected werden - vielleicht gibt es ein memory-Leak ausserhalb des geposteten Codes?
 

DP

Top Contributor
achso, sorry.

dann nur das stmt und das rs closen, da dies bei jedem query neu erzeugt wird.
 

schmuck.m

Mitglied
Hallo,

ja der Fehler war das das Statement und das ResultSet immer noch geöffnet waren. Gut, was ich immernoch nicht verstehe ist das der GC diese nicht irgendwann einfach mal aufräumt.

Ich hab das nun so gemacht das ich aus dem statischen DBConnector Objekt mir von der Connection ein Statement erzeuge und es auch wieder schließe - sind zwar ein paar zeilen mehr code pro Methode die auf die Datenbank will, aber dafür ist es sauber gemacht!

Danke für den Tipp mit dem Closen :) machmal sieht man halt vor lauter Bäumen den Wald nicht mehr :)



Gruß,
Michael
 

DP

Top Contributor
ja, der gc macht die irgendwann mal dicht, wenn der lust hat. du kannst aber auch den gc manuell anwerfen.

aber bleib mal bei der sauberen methode mit dem close :)
 

Kawa-Mike

Mitglied
Um ganz sicher zu gehen solltest du noch einen finally-Zweig einführen, wie es z.b. in der Tomcat-Dokumentation beschrieben ist.

http://tomcat.apache.org/tomcat-5.5-doc/jndi-datasource-examples-howto.html

Gerade bei langlaufenden Serveranwendungen können Dir nicht geschlossene Connections/Resultsets/Statements den RAM zumuellen und die Datenbank bleibt genau dann stehen, wenn gerade mal viel Traffic auf dem Server ist )-;

- - -
Connection conn = null;
Statement stmt = null; // Or PreparedStatement if needed
ResultSet rs = null;
try {
conn = ... get connection from connection pool ...
stmt = conn.createStatement("select ...");
rs = stmt.executeQuery();
... iterate through the result set ...
rs.close();
rs = null;
stmt.close();
stmt = null;
conn.close(); // Return to connection pool
conn = null; // Make sure we don't close it twice
} catch (SQLException e) {
... deal with errors ...
} finally {
// Always make sure result sets and statements are closed,
// and the connection is returned to the pool
if (rs != null) {
try { rs.close(); } catch (SQLException e) { ; }
rs = null;
}
if (stmt != null) {
try { stmt.close(); } catch (SQLException e) { ; }
stmt = null;
}
if (conn != null) {
try { conn.close(); } catch (SQLException e) { ; }
conn = null;
}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D MySQL Geburtsdatum per KW abfragen Datenbankprogrammierung 1
D MySQL Applet MYSQL Abfragen Sicherheit Datenbankprogrammierung 2
S MySQL Server Informationen abfragen Datenbankprogrammierung 6
brainray Bei MySQL alle Datenbanken eines Servers abfragen Datenbankprogrammierung 3
L MySQL : Funktionsweise von '%' in Abfragen Datenbankprogrammierung 2
Juelin Java und MySQL MariaDB - WHERE-Klausel Datenbankprogrammierung 17
W MySQL-Connector funktioniert nicht über WLAN -> MacOS Datenbankprogrammierung 10
Juelin MySQL Datenbankmit glassfish und Netbeans Datenbankprogrammierung 18
Auf MySql Datenbank zugreifen funktioniert nicht Datenbankprogrammierung 8
TheSkyRider MySQL Datenbankzuordnung in Verbindung mit Java Datenbankprogrammierung 7
Warum funktioniert MySQL nicht Datenbankprogrammierung 8
M MySQL Datenbank in Array Datenbankprogrammierung 2
P MySQL- Neues Passwort Datenbankprogrammierung 1
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
sserio SQL oder MySQL Datenbankprogrammierung 44
OnDemand Mysql Query Builder Datenbankprogrammierung 1
Z MySQL "Too many connections" auch nach schliessen der Connections. Datenbankprogrammierung 10
yakazuqi MySQL MySQL Connection reset Datenbankprogrammierung 7
OnDemand MySql Foreign Key nötig oder unnötig Datenbankprogrammierung 3
M Mysql Views und Hibernate Caching Datenbankprogrammierung 4
W MYSQL Datenbank Login Android Datenbankprogrammierung 3
OnDemand MySQL und mongoDB wann macht was Sinn? Datenbankprogrammierung 11
bueseb84 Spring Boot : Update Mysql Datenbank Datenbankprogrammierung 1
Avalon Attribute werden mit Unterstrich in eine MySQL Datenbank eingetragen Datenbankprogrammierung 10
D MYSQL goorm IDE - Wie speichern? Datenbankprogrammierung 0
OnDemand Mysql UPDATE if condition Datenbankprogrammierung 14
C Java MySQL check if value exists in database Datenbankprogrammierung 2
H Fehler bei getConnection zu MySQL Datenbank Datenbankprogrammierung 18
J MySQL - Primary Key Date,Time vs ID Datenbankprogrammierung 16
ruutaiokwu MySQL: Messwerte, welche stagnieren interpolieren? Datenbankprogrammierung 2
S Datenbank MySQL und Java Datenbankprogrammierung 8
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
P Adressadministration mit Java und mySQL Datenbankprogrammierung 14
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
platofan23 MySQL Java Programm findet Treiber für mySQL auf Debian-Server nicht? Datenbankprogrammierung 11
J MySQL MySQL Risiken bei Stromausfall minimieren Datenbankprogrammierung 9
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
H MySQL MySQL - Keine Verbindung zur Datenbank?! Datenbankprogrammierung 4
G MySQL Problem mit MySQL verbindung Datenbankprogrammierung 8
X MySQL Java hat keinen Zugriff auf MySQL Datenbankprogrammierung 9
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
D MySQL Connection richtig herstellen. Wie ? Datenbankprogrammierung 7
D Multiple Connection mit MySQL Datenbankprogrammierung 4
D MySQL Eibinden des "mysql-connector" in eine fertige Jar Datenbankprogrammierung 3
L MySQL Android zu externer MySQL Datenbank verbinden Datenbankprogrammierung 5
P Daten in eine mySQL Datenbank einfügen Datenbankprogrammierung 4
D MySQL Zeilen kumulieren Datenbankprogrammierung 8
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
K Servlet-MySQL DB Datenbankprogrammierung 2
X MySQL Json String in MySQL einfügen. Datenbankprogrammierung 20
OnDemand Update auf Mysql läuft nicht durch Datenbankprogrammierung 30
K Java Object mit Hibernate in MySQL abspeichern Datenbankprogrammierung 1
D Datumsformat aus MySQL ändern Datenbankprogrammierung 15
G MySQL Java Problem: Nullpointer Exception obwohl Daten vorhanden sind? Datenbankprogrammierung 2
K MySQL LAN-MySQL Server mit XAMPP Datenbankprogrammierung 2
R ERModel der Datebanken (ORACLE,MySQL,MS-SQL usw) Datenbankprogrammierung 4
X MySQL In MySQL Funktionen erstellen, wenn Zelle leer dann andere Zelle ändern? Datenbankprogrammierung 9
K Anfängerfrage CSV in MySQL Datenbankprogrammierung 41
I MySQL Wert nachträglich bearbeiten Datenbankprogrammierung 1
N MySQL Datenbank lokal Datenbankprogrammierung 3
B MySQL: Port ändern über GUI? Wo und wie Port ändern? Datenbankprogrammierung 0
B MySQL installieren - silent / User anlegen Datenbankprogrammierung 3
X MySQL Verbindungdsaufbau MySql auf Ubuntu-Server Datenbankprogrammierung 10
F MySQL Wie kann ich in Java Datensätze aus einer MySQL Datenbank gezielt in einzelne Arrays schreiben? Datenbankprogrammierung 9
P MySQL JPA / MySQL - Fehler bei type=innoDB Datenbankprogrammierung 8
M MySQL MySQL DATETIME-Import Datenbankprogrammierung 9
P MySQL Connection Global Datenbankprogrammierung 13
J mySQL- Java Application - Zugriff über Internet Datenbankprogrammierung 3
P MySQL-Verbindung in anderer Klasse nutzen Datenbankprogrammierung 2
D JavaFX Anwendung zugriff auf MySQL DB. Datenbankprogrammierung 2
D MySQL Grundsätzliche Fragen zu MySQL Datenbankprogrammierung 3
B MySQL LogIn Daten im Code verstecken Datenbankprogrammierung 3
M MySQL-Syntax-Fehler Datenbankprogrammierung 1
M In MySql Datenbank schreiben Datenbankprogrammierung 6
D mySQL Timestamp in RegularTimePeriod bzw Second Datenbankprogrammierung 3
H SHOW Tables in Java/MySQL Datenbankprogrammierung 8
windl MySQL und HSQLDB Datenbankprogrammierung 4
S Anbindung zur mysql von mit Swing und AWT Datenbankprogrammierung 22
F MySQL+ Netbeans: Datenbanken mit Automatisch generierten Entity Classes get und set Datenbankprogrammierung 2
I MySQL Hibernate / MySQL alias in WHERE clause Datenbankprogrammierung 1
C MYSQL kann wert nicht eintragen Datenbankprogrammierung 3
D Aktualisierung einer ListView mit Daten aus MySQL-DB Datenbankprogrammierung 5
F BPlaced MySql Datenbank ansprechen Datenbankprogrammierung 5
S MySQL MySQL will einfach nicht, bitte um Rat Datenbankprogrammierung 4
M MySQL Datenbank durchsuchen Datenbankprogrammierung 5
Z MySQL mysql Facharbeit: Tipps und Ideen gesucht Datenbankprogrammierung 5
dat_vin JavaFX Datenbankverbindung über JPA und MySQL Error Datenbankprogrammierung 0
K MySQL Datenbank 2facher Zugriff Datenbankprogrammierung 1
Z MySQL Shopsystem mit mysql und Java Datenbankprogrammierung 8
S [MySQL] Topliste Datenbankprogrammierung 2
H Datenbank-Anbindung Java/MySQL Datenbankprogrammierung 2
T MySQL MySQL - Insert into fügt zwei identische Datensätze ein Datenbankprogrammierung 2
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
J Dateien in MySQL speichern & indizieren Datenbankprogrammierung 2
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
K MySQL Datenbankbackups Datenbankprogrammierung 5
P MySQL INSERT / UPDATE MySQL - perStoredProcedure oder direkt im Code Datenbankprogrammierung 3
kaoZ HyperSQL vs. MYSQL Datenbankprogrammierung 4
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben