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
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);
}
}