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:
wenn ich nun etwas abfragen möchte arbeite ich so:
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");
...