Probleme bei Select in Schleife

Status
Nicht offen für weitere Antworten.
M

meli143

Gast
Hallo zusammen,

ich hoffe ihr könnt mir helfen, weil langsam weiß ich nicht mehr weiter.
Ich baue mir in meiner Java-Klasse mittels JDBC 2 Connections zu 2 DB auf. Eine Connection geht zu einer MySQL-DB, die andere zu einer DB2 auf der AS400.
Mein Programm soll andauernd prüfen, ob neue Sätze in die MySQL-Tabelle eingestellt wurden und diese Sätze dann in die AS400-DB kopieren.
Dazu baue ich am Anfang die Connections auf (funktioniert auch einwandfrei) und initiallsiere 3 Prepared Statements (SELECT, INSERT, UPDATE).
In der run-Methode habe ich eine Endlosschleife, in der immer das Select-Statement abgesetzt wird und die Ergebnissätze dann verarbeitet werden.
Am Ende der Verarbeitung lege ich den Thread dann für 10sec schlafen und schließe das ResultSet, bevor ich dann wieder meinen Select aufrufe.
Und genau hier liegt mein Problem. Solange das Select Ergebnissätze findet, läuft alles einwandfrei. Ab dem Moment, in dem aber mal keine Sätze gefunden werden,
bekomme ich nie mehr Ergebnisse für mein Select und das obwohl eindeutig neue Sätze in die File gekommen sind.
Dieses Problem habe ich egal, ob ich Prepared Statements oder einfache Statements benutze und der Cache der MySQL wird laut Doku auch bei jeder Manipulation der File geleert, so dass es daran auch nicht liegen dürfte. Aber momentan ist die einzige Möglichkeit, dass alles so funktioniert wie es soll, dass ich die Connection nach jeder Verarbeitung schließe und dann wieder öffne, aber das kann ja nicht die Lösung sein, oder?!
Ich würde mich freuen, wenn euch was einfallen würde und ihr mir Tipps gebt, wo der Fehler liegen könnte.
Danke!
LG Meli

Java:
public void init()
	{	
		
		try // Connection erstellen
		{
			Class.forName("com.ibm.as400.access.AS400JDBCDriver");
			String urlLocal = "jdbc:as400://XXXXXXXX/XXXXXXX";
			Class.forName("com.mysql.jdbc.Driver" );
			String urlRemote = "jdbc:mysql://XXX.XX.XXX.XXX:XXXX/XXXXXX");
			String user = "*CURRENT*";
			String pwd = "*CURRENT*";
			String userRemote = "*CURRENT*";
			String pwdRemote = "*CURRENT*";
			conLocal = DriverManager.getConnection(urlLocal, user, pwd);
			conLocal.setAutoCommit(false);
			conRemote = DriverManager.getConnection(urlRemote, userRemote, pwdRemote);
			conRemote.setAutoCommit(false);
		}
		catch(Exception e)
		{
			log.fatal("Beim Aufbau der Connection zu den Datenbanken ist ein Fehler aufgetreten ", e);
			System.exit(1);
		}
		
		try
		{  
			selectRemoteData = conRemote.prepareStatement("SELECT * FROM " + RemoteTabName 
			+ " WHERE XSTAT = ' ' AND DATEN IS NOT NULL");
			
			insertLocalTab = conLocal.prepareStatement
			("INSERT INTO " + LocalTabName + " (RECNO, XSTAT, TMSTP, TMSTU, USRID, DATEI, DATEN) "
			+ "VALUES ( ?, ' ', ?, CURRENT TIMESTAMP, '', ?, ?)");
			
			updateRemoteTab = conRemote.prepareStatement
			("UPDATE "+ RemoteTabName + " SET XSTAT = ? WHERE RECNO = ?" );*/
		}
		catch(Exception e)
		{
			log.fatal("Fehler bei Initialisierung der Statements!" , e);
			System.exit(1);
		}
	} 
	
	
	public void run() {
				
		try{
			ResultSet resultLocal;
			//Schleife um "endlos" select zu lesen
			while (true)
			{  
				try
				{  
					resultLocal = null;
					resultLocal = selectRemoteData.executeQuery();//Selektieren aller zu kopierender Rows
					
					while (resultLocal.next() && !exit)
					{	
						xStat          = "99";
						String recno   = resultLocal.getString("RECNO");
						String daten   = resultLocal.getString("DATEN");
						String datei   = resultLocal.getString("DATEI");
						Timestamp time = resultLocal.getTimestamp("TMSTP");
						try
						{
						    if (!daten.substring(0,endString.length()).equalsIgnoreCase(endString))
							{
								insertLocalTable(recno, daten, datei, time);
							}
						    updateRemoteTable(recno);
						    commit(recno);
						}
						catch(Exception e)
						{
							rollback(recno);
						}
					}
				}
				catch(Exception e)
				{
					log.fatal("Fehler beim Lesen der Tabelle " + RemoteTabName + ": ", e);
					throw new SQLException(e.getMessage());
				}
				System.out.println("gelesen :" + zähler);
				zähler = 0;
				if (exit)
				{
					end();
					throw new EndException("Der Thread Main wurde normal beendet") ;
				}
				try
				{
					resultLocal.close();
					//Thread wird schlafen gelegt
					Thread.currentThread().sleep(sleepTime);
				}
				catch(InterruptedException e){}
			}
		}
		catch(EndException e)
		{
			log.info(e.getMessage());
		}
		catch(Exception e)
		{
			log.fatal("Fehler beim Ausführen der Run-Methode des Thread Main", e);
		}
		finally
		{
			System.exit(1);
		}
    }
 
M

maki

Gast
Würde an deiner Stelle jedesmal eine neue Connection, PreparedStatement und ResultSet verwenden.
Soweit ich weis gibt es einen Timeout für die Connection, zumindest in MySql den man erst wieder verändern müsste.
Aber da es bei dir ja nicht um Performance geht (sonst wäre ein ConnectionPool angebracht) würde ich wirklich jedesmal alles neu aufbauen.
 
M

meli143

Gast
Hallo maki,
danke für die schnelle Antwort. Die Sache ist, es geht schon um Performance, da dieses Programm ununterbrochen laufen und die Daten lesen und kopieren soll.
Das heißt also, dass die Connection zu MySQL einen Timeout bekommt, wenn man keine Ergebnisse bekommt? Weil den Select setze ich ja regelmäßig ab, und das Problem besteht ja auch erst ab dem Moment, in dem ich zum ersten Mal keine Sätze bekomme.
LG Meli
 
M

maki

Gast
Die Sache ist, es geht schon um Performance
Kann ich mir ehrlich gesagt gar nicht vorstellen, ob du nun 9,98 Sekunden wartest und dann eine neue Conenction aufbaust oder 10 Sek. wartest um deine alte wiederzuverwenden...

Der Timeout sollte mit deinem Problem eigentlich nix zu tun haben, aber sagen kann ich dir dazu nix konkretes.
 
M

meli143

Gast
Hallo Maki,

klar da hast du Recht, wenn ich einfach den Timeout kürzer mache und die neue Connection aufbaue ist egal und kein Zeitverlust. Ich finde es halt nur so komisch, warum das nicht funktioniert, aber vielleicht finde ich das auch noch raus, danke auf jeden Fall für die antwort
 
M

maki

Gast
Würde die 10 Sek. warten gar nicht ändern, worauf ich hinaus wollte war, dass die Zeit eine Connection zu öffnen vernachlässigt werden kann, wenn du sowieso 10 Sek. wartest, das merkt kein User ;)

Hast du mal versucht jedesmal ein neues Statement zu öffnen anstatt die alten wiederzuverwenden?
 
M

meli143

Gast
Naja da es ein Batch-PGM ist, merkt das eh kein User ;-) Ich finds halt nur unbefriedigend, dass man jedesmal die Connection schließen und wieder öffnen muss. Ich hatte es nur probiert, dass ich anstatt PreparedStatements normale Statements genommen habe, bei denen man immer wieder das Query als String mitgeben muss. Das hat aber auch nix gebracht.
 
S

SlaterB

Gast
es ist unfair, sowas erstmal Java anzulasten oder auch nur klären zu müssen,

DB-Systeme sollten viel mehr Logging bieten,
welche Query kommt zu welchem Zeitpunkt rein, was wird zurückgeliefert ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
4 Probleme mit Select abfrage Datenbankprogrammierung 4
TH260199 Java-Programm. Probleme bei der Umsetzung von einer Kontaktverwaltung. Datenbankprogrammierung 7
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
Kirby.exe Probleme mit docker-compose.yml Datenbankprogrammierung 4
B Probleme mit Datenbankverbindung Datenbankprogrammierung 2
N java SQL JAR - Probleme Datenbankprogrammierung 18
S probleme mit dem jdbc treiber Datenbankprogrammierung 1
T Oracle Probleme bei getTableName Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
D Probleme bei Einsteiger Aufgabe SQL Datenbankprogrammierung 2
M JAVA Derby INSERT probleme Datenbankprogrammierung 12
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
H Probleme mit Unicodedarstellung in Derby DB Datenbankprogrammierung 1
M MySQL probleme beim "Generate Tables from Entities" Datenbankprogrammierung 9
L Probleme mit DriverManager.getConnection(..) - Endlosschleife, Java Absturz, Keine Exception Datenbankprogrammierung 4
S Derby/JavaDB Probleme beim anlegen einer embedded DB Datenbankprogrammierung 13
P Probleme mit meinem 1. Hibernate Beispiel Datenbankprogrammierung 3
W Probleme mit AND und OR Datenbankprogrammierung 5
D DB Tabelle in JTable anzeigen - Probleme Datenbankprogrammierung 8
Gossi CallableStatement Probleme Datenbankprogrammierung 8
D Probleme bei der Erzeugung einer Tabelle Datenbankprogrammierung 15
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
R Derby/JavaDB Insert Statement Probleme Datenbankprogrammierung 14
L Derby/JavaDB Derby macht Probleme Datenbankprogrammierung 4
M Probleme mit Triggering Datenbankprogrammierung 2
F DB2 Probleme mit dem DriverManager Datenbankprogrammierung 4
S Derby/JavaDB OpenJPA, @oneToMany und Probleme Datenbankprogrammierung 2
I MySQL Probleme mit kyrillischen Zeichen Datenbankprogrammierung 2
A Derby/JavaDB Probleme beim Einbinden Datenbankprogrammierung 2
S Probleme mit INSERT Befehl Datenbankprogrammierung 11
R isLast() Probleme bei Pervasive Datenbankprogrammierung 5
S Probleme mit localhost Datenbankprogrammierung 14
M Oracle Probleme mit dem anbinden einer Oracle 10g Datenbank Datenbankprogrammierung 27
J MySQL Hibernate: Probleme beim Speichern von OneToMany - Datensätzen Datenbankprogrammierung 2
P Hibernate -> Probleme bei n:m-Relation und JUnit Datenbankprogrammierung 10
J Probleme mit Datenbankzeiger Datenbankprogrammierung 19
A Probleme mit auf DB2 Express zugreiffen Datenbankprogrammierung 6
N Probleme beim Aufruf aus der DB Datenbankprogrammierung 7
G Probleme mit Datenbankanbindung Datenbankprogrammierung 3
R Probleme mit Insert Datenbankprogrammierung 2
P Probleme mit Oracle Timestamp Datenbankprogrammierung 3
klattiator Hibernate - Probleme bei Konfiguration Datenbankprogrammierung 3
F Probleme mit entfernter DB und Hibernate Zeichensatz Datenbankprogrammierung 3
G Probleme mit der Schnittstelle H1bernate/Eclipse Datenbankprogrammierung 6
A Probleme mit Jar-File in ein Jar-File Datenbankprogrammierung 8
O Derby Performance Probleme? Datenbankprogrammierung 4
V Probleme beim Öffnen "einiger" SuperbaseTabellen p Datenbankprogrammierung 8
G Probleme beim Methodenaufruf einer EJB Datenbankprogrammierung 10
ARadauer hibernate probleme Datenbankprogrammierung 13
Y Probleme mit H2 und Primary Key Datenbankprogrammierung 4
D Probleme mit mysql-Connection Datenbankprogrammierung 10
G INNODB backup probleme Datenbankprogrammierung 2
S Probleme mit statement.close() Datenbankprogrammierung 10
A Probleme beim Schreiben in eine CSV-Datei aus einer H2-DB Datenbankprogrammierung 2
G Probleme mit Laden des JDBC-Treiber in HSQLDB Datenbankprogrammierung 2
T Probleme mit Date in H2 Datenbank Datenbankprogrammierung 2
N Probleme mit Access-DB bei einem Webserver Datenbankprogrammierung 5
T Diverse JDBC Probleme (inner join, rs.last(), update) Datenbankprogrammierung 2
R Probleme mit Datensätzen in MySql DB Datenbankprogrammierung 3
B Oracle Driver Probleme Datenbankprogrammierung 2
I Probleme bei MySQL - Replikation Datenbankprogrammierung 2
R Probleme mit ausführbarem Jar Archiv Datenbankprogrammierung 9
F Probleme mit Jar Datei Datenbankprogrammierung 3
S String probleme Datenbankprogrammierung 3
R Probleme mit der Verbindung zum localhost Datenbankprogrammierung 12
S Probleme bei der Installation von MySQL 5.0 Datenbankprogrammierung 4
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
G Probleme mit Access und Join Datenbankprogrammierung 3
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
M Daten von MySQL nach MSSql probleme beim schreiben Datenbankprogrammierung 3
S JDBC-Anfänger und Probleme beim Treiberfinden etc. Datenbankprogrammierung 4
T Probleme beim Verbindungsaufbau zum SQL 2000 Datenbankprogrammierung 2
G Probleme mit Datenbankeinträge Datenbankprogrammierung 4
G Probleme mit Treiber (connector) Datenbankprogrammierung 20
thE_29 getBytes() - russland/bulgarien -- andere Codecs Probleme Datenbankprogrammierung 8
E Probleme mit JDBC und Executable-Jar Datenbankprogrammierung 2
G Probleme mit MySQL - Anmeldung Datenbankprogrammierung 2
P Probleme mit NullPointerException Datenbankprogrammierung 5
K MySQL: Probleme mit dem Verbinden per IP-Adresse Datenbankprogrammierung 6
T Probleme mit Datenbank Datenbankprogrammierung 6
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
OnDemand Select * from bringt keine Rückgabe Datenbankprogrammierung 49
OnDemand Select vs Update ins blaue, was ist teurer? Datenbankprogrammierung 11
M JPA: select all mit unterschiedlichem Tablename Datenbankprogrammierung 2
A MySQL Select und Insert in Java Datenbankprogrammierung 15
J JPA: Wie sieht der select aus? Datenbankprogrammierung 2
D geänderte SELECT Abfragen Datenbankprogrammierung 15
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
T sqlite select Datenbankprogrammierung 12
D Oracle NullPointerException bei select mit Null Values Datenbankprogrammierung 5
F MySQL Was bedeuten die Einzelnen Zeichen in Select Querrys? Datenbankprogrammierung 1
J SQL SELECT mit einem Array Datenbankprogrammierung 1
J SELECT Abfrage/Suche Datenbankprogrammierung 4
E Kann man in einer if-Bedingung auch SELECT-Statements überprüfen? Datenbankprogrammierung 23
M SQL-Exception trotz funktionierendem SELECT Datenbankprogrammierung 4
U PostgreSQL SELECT Statement Datenbankprogrammierung 5
L Select Anweisung wird falsch interpretiert Datenbankprogrammierung 3
C HSQLDB Platzhalter in SELECT Datenbankprogrammierung 6
I SELECT bei Datenbankverbindung Datenbankprogrammierung 6

Ähnliche Java Themen

Neue Themen


Oben