SQL-Statement Wie konfiguriert man JDBC-Connect.richtig, damit es bei riesigen Tabs keinen Speicherüberlauf gibt?

flenst111

Mitglied
Ich habe eine Anwendung mit der ich u.a. durch riesige Tabellen mit Millionenden von Zeilen iterieren muß. Mich interessiert immer nur die aktuelle Zeile aus dem RESULTSET. Ich habe jetzt schon in etlichen Büchern gewälzt, etliche Vorschläge gelesen und leider keine funktionierende Lösung für die von mir verwendeten JDBC-Treiber für die MAXDB und postgres (JDBC3-Treiber,JDBC4-Treiber für Postgres 9.1,..) gefunden. Manchmal werde ich auch nicht schlau aus den Vorschlägen und man erkennt nicht, ob der Ansatz nun funktioniert hat oder nicht. Ich habe nun schon etliche Tests hinter mir und keine vernünftige Lösung. Ich habe mit unserem SQL-Framework unter Verwendung von c3p0 und ComboPooledDataSource getestet, ich habe nativ mit groovy-sql getestet und diverse Parameter geändert, um den Übeltäter zu finden. Es ist mir nicht gelungen. Ich habe die gleiche Applikation gestartet und mir mit einem Modul, die Daten aus einem JSON-File eingelesen (anstatt das SELECT-Modul zu verwenden) und dabei natürlich keinen Memoryleak erhalten. Der Prtogrammablauf mit den Konfigurationsparametern ist in einem XML-Script erkennbar. (wenn nötig kann ich dazu einen Graph (mit Graphviz erstellt) liefern. Hier das Script:

<?xml version="1.0" encoding="UTF-8"?>
<runner class="servicerunner" verbose="false">

<do doname="startanweisung" classname="BSStarter" verbose="false">
<starte doname="SELECT_TIERE" />
</do>

<do doname="SELECT_TIERE" classname="SelectNext" verbose="false" dbsynonym="SPEKDB.VVVODBA" type="extended" fetchsize="10" resulttyp="FORWARD_ONLY" autocommit="true" concurrency="CONCUR_READ_ONLY" holdability="CLOSE_CURSORS_AT_COMMIT" checkmem="true" erg="auswahl" >
<abfrage doname="selabfrage"
abfrage="select * from calving"/>
<starte doname="auswahl2json" verbose="true" />
<starte doname="count" id="count4a"/>
<starte doname="gacol" id="cmd4b"/>
<starte doname="checkmem" id="cmd5"/>
</do>

<do doname="auswahl2json" classname="Var2JsonFile" verbose="true" variable="auswahl" checkmem="true" jsonfile="/tmp/auswahl.json" />
<do doname="gacol" classname="GaCol" verbose="true" />
<do doname="count" classname="Counter" verbose="false" />
<do doname="checkmem" classname="CheckMemory" memdiff="0" gjbname="memgjb" httpresponse="anfrage.httpresponse" />
</runner>

Dabei wird ein anschließend ein Garbage Collection-Modul aufgerufen und danach der Speicherzustand ausgegeben. In der LOG-Datei steht nach dem 1 Durchlauf

20150106 121425 INFO de.lkv.runner.does.BasicDo:call: checkmem kb::run_end:-auswahl2json:-1-DL:1000: umemKB:164530 freeKB:147277 maxKB:1720320

Nach dem 7600 Durchlauf

20150106 130055 INFO de.lkv.runner.does.BasicDo:call: checkmem kb::run_start:-auswahl2json:-1-DL:7600: umemKB:173548 freeKB:125459 maxKB:1720320

umemKB gibt den von der Applikation benutzten Speicher aus. Man sieht auch hier deutlich den Zuwachs trotz Garbage-Collection, den man natürlich in der Produktion nicht so wie in diesem Fall einsetzen würde. Die Selectklasse sieht wie folgt aus:

Java:
public Select(String dbsynonym, String sqlstr,int fetchsize,int resultSetType, int resultSetConcurrency,int resultSetHoldability,boolean autocommit) throws SQLException {
		this.sqlstr = sqlstr;
		this.dbsynonym = dbsynonym;
		con = null;
		try {
			dsm = DataSourceManager.getInstance();

			con = dsm.getConnection(dbsynonym);
            con.setAutoCommit(autocommit);
			log.debug("testselect:" + sqlstr);
		//	stmt = con.createStatement();
		    stmt = con.createStatement(resultSetType,resultSetConcurrency,resultSetHoldability);
		//    stmt = con.createStatement(ResultSet.FETCH_FORWARD,java.sql.ResultSet.CONCUR_READ_ONLY);
		    stmt.setFetchSize(fetchsize);
		    rs = stmt.executeQuery(sqlstr);
		    
			meta = rs.getMetaData();
			columnlist = SQLUtils.getColumnNameList(meta);
			metacolumns = SQLUtils.retrieveMetaData(meta);
			
			anzcols = meta.getColumnCount();
			anzrows = 0;
			meta = null;
		} catch (LKVException ey) {
			log.error("LKVException:", ey);
			try {
				if (rs != null) rs.close();
				if (stmt != null) stmt.close();
				if (con != null) con.close();
			} catch (Exception ex) {
				log.error("Close zweifelhaft " + dbsynonym + " " + sqlstr, ex);
			}

		} catch (SQLException e) {
			mStatus = false;
			mSqlcode = e.getErrorCode();
			mSQLMessage = e.getMessage();
			try {
				if (rs != null) rs.close();
				if (stmt != null) stmt.close();
				if (con != null) con.close();
			}

			catch (Exception ex) {
				log.error("Close zweifelhaft " + dbsynonym + " " + sqlstr, ex);
			}

			if (SQLUtils.checkDontThrow(dbsynonym, e)) {

				log.info("SQLException mit Code " + mSqlcode
						+ " wurde abgefangen. Message:\n   " + e.getMessage());

			} else
				throw e;
		}
	}

Die Methode, mit der die jeweils aktuelle Zeile abgearbeitet wird, sieht wie folgt aus:

Java:
public Map getnext() throws SQLException {
	  try{
		if (rs.next()) {
           	return SQLUtils.transferData(rs, columnlist, metacolumns);
			          
        } else {
           
            return null;
        }
	} catch (SQLException e) {
		mStatus = false;
		mSqlcode = e.getErrorCode();
		mSQLMessage = e.getMessage();
		log.error(mSQLMessage,e);

        			
	} catch (Exception e) {
		log.error("LKVException:", e);

	}
		return null;
    }
 

flenst111

Mitglied
Ach ja, mit 7600 Zeilen ist es bis dahin natürlich keine riesige Datenmenge, aber ich habe dort abgebrochen, da ich über LTE eine Verbindung zu unserem Server habe und ich meine Flatrate nicht aufbrauchen möchte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D MySQConnextor Class not found obwohl BuildPfad konfiguriert Datenbankprogrammierung 6
B SQLite + jdbc + IntelliJ-Consumer = "No suitable driver found..." Datenbankprogrammierung 15
J PC-Start Problem JDBC Connection Datenbankprogrammierung 10
N JDBC SQLITE und Cascading Datenbankprogrammierung 2
D Asynchrone Aufrufe mit jdbc Datenbankprogrammierung 5
Edin JDBC Hilfe Datenbankprogrammierung 2
H JDBC Tabellen ausgeben Datenbankprogrammierung 8
Husamoli345 JSF-JDBC Verbindung Crud Datenbankprogrammierung 15
G MySQL JDBC Metadaten auslesen aus .accdb -> Primärschlüssel manchmal erkannt manchmal nicht Datenbankprogrammierung 3
N Java, sql, jar, JDBC-Treiber in Classpath Datenbankprogrammierung 8
O Create Table per JDBC Fehler: ORA-00922 Datenbankprogrammierung 4
J JDBC anschaulich präsentieren Datenbankprogrammierung 2
Thallius MySQL JDBC auf Linux Server zu mySQL DB auf anderem Linux Server wirft Access denied Datenbankprogrammierung 5
ralfb1105 Oracle JDBC Debugging Datenbankprogrammierung 8
Z [JDBC][MYSQL] Access denied Datenbankprogrammierung 7
Thallius MySQL jdbc schließt Verbindung nach vielen Request von selber Datenbankprogrammierung 8
B MySQL JDBC Kommentarfilter Datenbankprogrammierung 4
Aruetiise MySQL Name JDBC Drive finden Datenbankprogrammierung 4
E Sqlite-jdbc Mitliefern Datenbankprogrammierung 4
R jdbc-Zugriff Nicht erlaubt ? Datenbankprogrammierung 16
S probleme mit dem jdbc treiber Datenbankprogrammierung 1
Thallius MySQL Merkwürdiges JDBC Verhalten bei VPN Verbindung. Datenbankprogrammierung 7
O JDBC Daten in zwei Tabellen mit zwei foreach-Schleifen einfügen (insert into) Datenbankprogrammierung 1
F MySQL JDBC Problem Datenbankprogrammierung 5
C JDBC und SQLite Datenbank Datenbankprogrammierung 8
looparda SQLite Active JDBC Abstraktion Datenbankprogrammierung 2
J JDBC SQL Statement mit Parameter Datenbankprogrammierung 7
S JDBC PreparedStatement durchiterieren Datenbankprogrammierung 6
J RESTServie + JDBC + No suitable driver found for jdbc Datenbankprogrammierung 4
KaffeeFan JDBC/ODBC-Bridge entfernt Datenbankprogrammierung 4
S sun.jdbc.odbc.JdbcOdbcDriver wird nicht gefunden Datenbankprogrammierung 2
J Fehlende DatenbankView nach einbeziehen von JDBC Datenbankprogrammierung 3
A Mit JDBC auf postgreSQL Datenbank zugreifen Datenbankprogrammierung 5
C PostgreSQL JDBC + PostgreSQL: getLong liefert 0 statt NULL Datenbankprogrammierung 2
M JDBC Tabellen mit Boolean Spalten können nicht erstellt werden. DB Updaten - wie? Datenbankprogrammierung 6
S JDBC mit Postgres DB connecten Datenbankprogrammierung 3
A Eine MySQL Zeile mit JDBC löschen Datenbankprogrammierung 5
D JDBC - Verständnisfrage Datenbankprogrammierung 2
C Tabelle erstellen mit Apache JDBC-Util Datenbankprogrammierung 1
L Conversion-Error bei JDBC Date Literals Datenbankprogrammierung 3
X MySQL DB-verbindung ohne JDBC/ODBC Datenbankprogrammierung 1
F sun.jdbc.odbc.jdbcodbcdriver wird nicht gefuden Datenbankprogrammierung 3
J Keine Verbindung zu MSSQL DB mit JDBC Datenbankprogrammierung 3
U JDBC prepaird Statements Datenbankprogrammierung 4
B MySQL JDBC Zugriff auf entfernt Datenbank, fehlende Rechte Datenbankprogrammierung 2
Q MySQL JDBC-Treiber Problem Datenbankprogrammierung 2
R Transaktionen von mehreren Anwendungen aus - JDBC Datenbankprogrammierung 3
N MySQL com.microsoft.sqlserver.jdbc.SQLServerException: Die Verbindung wurde geschlossen. Datenbankprogrammierung 1
N JDBC: rollback() bei Exception geht nicht!? Datenbankprogrammierung 1
C Dateipfad des jdbc Treibers Datenbankprogrammierung 2
G JDBC Connect nur über SID fehlerfrei möglich Datenbankprogrammierung 2
R Oracle jdbc Zugriff auf Oracle Datenbankprogrammierung 2
T JDBC Fehler Datenbankprogrammierung 2
J JDBC via Singleton Datenbankprogrammierung 12
Z PostgreSQL JDBC mit Postgresql Datenbankprogrammierung 2
B No suitable driver found for jdbc:oracle:thin:@$HOST:$PORT:$SID Datenbankprogrammierung 7
K JDBC via Netzwerk Datenbankprogrammierung 4
B JDBC Connection Fehler Datenbankprogrammierung 8
K JDBC- In Java "stored procedure" erstellen für DB2,OracleSql ... Datenbankprogrammierung 3
J JDBC in Library|"Treiber konnte nicht geladen werden"" Datenbankprogrammierung 2
B JDBC-Connection: Data source name too long Datenbankprogrammierung 3
D JDBC insert mit select abfrage Datenbankprogrammierung 5
A JDBC Prepared Statement Autoincrement Datenbankprogrammierung 3
H JDBC prüfen ob Table existiert Datenbankprogrammierung 3
crashfinger jdbc-connection mit jre7 funktioniert nicht Datenbankprogrammierung 5
0 JDBC Oracle Verbindungsaufbau Datenbankprogrammierung 6
Q Oracle Linux: ClassNotFoundException: oracle.jdbc.driver.OracleDriver Datenbankprogrammierung 6
B JDBC MySQL Statement Datenbankprogrammierung 3
F Oracle Oracle JDBC Anbindung unter Glassfish 3.1.2 Datenbankprogrammierung 3
V PostgreSQL JDBC Treiber fehlt Datenbankprogrammierung 6
Y JDBC - Datenbankabfrage Webserver Datenbankprogrammierung 4
C JDBC Datenbank funktioniert nicht Datenbankprogrammierung 7
C JDBC , JDO oder JPA Datenbankprogrammierung 17
J MySQL Datenbank konfigurieren, JDBC, MySQL oder Hibernate Datenbankprogrammierung 2
P JDBC Verbindung zur DB klappt nicht Datenbankprogrammierung 6
J Java - JDBC Verbindung zur Datenbank nicht möglich Datenbankprogrammierung 10
K JDBC Buch kaufen? Datenbankprogrammierung 3
K Hibernate vs. JDBC Datenbankprogrammierung 4
K JDBC Driver not found Datenbankprogrammierung 10
GianaSisters Per JDBC auf Microsoft SQL 2005 Datenbankprogrammierung 24
S ich brauche tipps für JDBC Datenbankprogrammierung 4
Paristick MSSQL - JDBC Exception beim Registrieren Datenbankprogrammierung 5
S Applet stucks at SQL Connection (jTDS JDBC) Datenbankprogrammierung 15
R MySQL Voraussetzungen für eine erfolgreiche Datenbankanbindung mittels JDBC Datenbankprogrammierung 2
c_sidi90 JDBC Oracle Connection schlägt fehl Datenbankprogrammierung 2
J jdbc-dataSource in Klassen nutzen Datenbankprogrammierung 2
H Rechnen in Datenbanken - JDBC Mittel der Wahl? Datenbankprogrammierung 32
K MySQL JDBC - Access Datenbank - unbekannter TabellenName Datenbankprogrammierung 4
D JDBC Fehler beim laden der nativen Bibliothek db2jcct2 Datenbankprogrammierung 9
J MySQL Verbindung über JDBC scheitert immer Datenbankprogrammierung 2
I Master/Detail Tabellen mit JDBC und Swing Datenbankprogrammierung 10
S MSSQL JDBC "Driver class not found" Datenbankprogrammierung 9
E Datenbankverbindung mit Oracle JDBC und Eclipse Plugin Quantum db Datenbankprogrammierung 2
ruutaiokwu jdbc connection als singleton Datenbankprogrammierung 11
J MySQL Löschen von Rows mit JDBC Datenbankprogrammierung 9
G JDBC Exception Datenbankprogrammierung 3
Screen Ich suche eine SQLDatenbank ohne JDBC-Treiber Datenbankprogrammierung 12
F Fehlerhandling bei JDBC Datenbankprogrammierung 9
T JDBC und Arrays Datenbankprogrammierung 7
X Oracle JDBC und Joins? Datenbankprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben