PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zusätzliche Tabellen können nicht geöffnet werden.


Gast
2006-08-09, 17:01:14
Hi,
ich habe einen dummer JDBC Fehler.
Ich schreib gerade eine Simulation und bekomme diesen fehler obwohl ich imo nach jeden Zugriff die tabellen wieder frei geben. Dies geschieht wenn ich mit 50 simulierten personen auf eine Datenbank zugreifen will per Threads und gleichzeitig verschiedene abfragen und einfüge Aktion durchführen möchte.
Ich benutzen den Standart JDBC Treiber und greifen auf eine Acess Datenbank zu.

AbfrageKlasse:

package trust;

import java.sql.*;
public class DBQuery {
Statement stmt;
Connection con;
trust.DBConnection tmp;
public DBQuery()
{
tmp = DBConnection.get_Object();
con=tmp.get_Connection_Obj();
}

public ResultSet query(String sql)
{
try
{
stmt=con.createStatement(
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);



stmt.executeQuery(sql);
return stmt.getResultSet();
}
catch(SQLException e)
{
e.printStackTrace();
return null;
}

}
}
Datenmanipulationklasse:
package trust;

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


public class DBManipulateData
{
Statement stmt;
Connection con;
trust.DBConnection tmp;
public DBManipulateData()
{
tmp = DBConnection.get_Object();
con=tmp.get_Connection_Obj();
}

public boolean insert(String sql)
{
try
{
stmt=con.createStatement();

stmt.execute(sql);
stmt.close();

return true;
}
catch(SQLException e)
{
e.printStackTrace();
stmt.close();
return false;
}

}

public boolean update(String sql)
{
try
{
stmt=con.createStatement();
stmt.executeUpdate(sql);



return true;
}
catch(SQLException e)
{ System.out.println(e);
stmt.close();
return false;
}
}



}

Auf diese Funktion wird während der Simulation nur zugegriffen.
Wer jemand von euch darüber mehr?

Köppchen
2006-08-11, 01:10:52
Hi, habe zwar deinen Code nicht genau angesehen, aber beim schnellen überfliegen kein close() auf die Connection gesehen. Das bedeutet deine Connection wird fast nie freigegeben. Eine Freigabe findet nur statt wenn der Garbage collector zufällig mal eine nicht mehr verwendete connection wegräumt.
Du solltest also die connection mit close() wieder freigeben wenn diese nicht mehr weiterverwendet wird.
Mit Access kenne ich mich nicht aus, ich kenne es nur von anderen Datenbanken das man die Anzahl Verbindungen konfigurieren kann. Wenn die Datenbank nur 40 Verbindungen entgegennehmen kann, so bekommst du bei der 41.ten gleichzeitigen Verbindung dann einen Fehler.

Ich hoffe das gibt schon mal genug Denkanstösse bei der Fehlersuche.

Gruß Markus

Gast
2006-08-11, 14:54:51
Hi,
die die Klasse, die die Verbindung zur DB herstellt ist ein Singleton, also gibt es nur eine einzige verbindung. Ich überprüf mal die Einstellungen von Access.