Java als Datengateway

boyben

Mitglied
Ok, ich hol erst mal etwas aus damit man ungefähr verstehen kann um was es geht.
Ich entwickle momentan eine Webapplikation(Shop) die bis auf wenige Kleinigkeiten fertig gestellt ist.
Sie basiert auf PHP und Mysql als Datenbank.
Alle Daten in der Mysql DB werden mit Perl Skripten über einen DBD Treiber mit einer ADS Datenbank synchronisiert.Diese Daten werden nur alle 20 Minuten synchronisiert da sie nicht anwendungskritisch sind.

Nun brauche ich aber noch einen Gateway der auf der Mysql Datenbank lauscht. Sobald dort ein entsprechender Eintrag zu finden ist soll in Echtzeit die ADS Datenbank nach dem Artikel Bestand abgefragt.

Dafür gibt es auch schon ein Perl Skript, aber leider ist der DBD Treiber der ADS Datenbank nicht zuverlässig und es kommt allzu oft zu Abrrüchen.

Nun habe ich mal Testweise den JDBC Treiber getestet. Dieser scheint bisher sehr stabil zu sein.

Ich habe auch schon die komplette Anwendung in Java programmiert. Nun würde ich aber gerne noch eine Oberfläche dazu programmieren um z. Bsp Statusinformationen anzuzeigen.

Die Mysql Datenbankabfrage läuft in einer Endloschleife

Code:
while (true)
{
 // DB Abfrage
 // Wenn ein Datensatz in der Mysql DB gefunden wurde frag die ADS DB
 // nach dem Bestand und gebe in die jTextArea1 eine Info das ein Datensatz 
 // bearbeitet wurde.
}

Leider wird mir gar nichts ausgeben. Kann mir jemand sagen was ich falsch mache?
 
Ok hier nochmal ein Code auschnitt stark vereinfacht:
Code:
 private void jButton2MouseClicked(java.awt.event.MouseEvent evt) {                                      
       Integer i = 0;
       
        while (i == 0)
        {
            jTextArea1.append("Test\n");
        }

Warum gibt mir das nicht fortlaufend "Test" in der Textarea aus?
 
weil i ein Integer ist und Du in der while nach == 0 abfrägst.

Die while muss folgendermaßen aussehen:

while(i.intValue() == 0)
.
.
.


oder du verwendest gleich einen primitven Datentyp

int i = 0;

while( i == 0)
.
.
.
.
 
Zudem blockiert die Endlosschleife vermutlich den GUI-Thread. Du solltest die Abfrage in einen eigenen Thread auslagern.
 
Danke erstmal für die Tips. Ich habe gerade neu mit Java angefangen. Kann mir jemand kurz erklären wie Madcat das meint mit dem Auslagern in einen eigenen Thread? Am besten mit Codebeispiel.

Soweit schonmal vielen Dank!
 
Nicht nur die GUI... auch in einem eigenen Thread wird sowas vermutlich relativ schnell die DB in die Knie zwingen... Pausenlos pollen ist sicher keine gute Lösung...
 
Also die Tabelle die abgefragt wird ist standardmäßig leer, die DB Geschwindigkeit leidet auch nicht darunter, zumindest nicht merklich.
Wie könnte man das den besser machen?
 
Also mit den Threads klappt es jetzt.
Aber ich glaube noch das ich ein Grundverständniss Problem habe!
Ich habe also nun eine eigene Thread Klasse:
Code:
class MyThread extends Thread
 {
  int i;
  
     public void run()
   {     
        int i = 0;
        ResultSet my_result, ad_result;
        String db_url1 = "jdbc:mysql://0.0.0.0/db_name";
        String db_user = "user", db_pass = "password", query_str;
        String db_url2 = "jdbc:extendedsystems:advantage://0.0.0.0:0/pfadzudaten";
        try {
            
            Class.forName("com.mysql.jdbc.Driver");
            Class.forName("com.extendedsystems.jdbc.advantage.ADSDriver");           

            Connection mysql_con = DriverManager.getConnection(db_url1, db_user, db_pass);
            Connection ads_con = DriverManager.getConnection(db_url2);

            while (true) 
            {         
                       Statement mysql_stmt = mysql_con.createStatement();
                       Statement mysql_upda = mysql_con.createStatement();
                          		
                       // Gibt es Datensätze?
                       query_str = "SELECT COUNT(*) as rowcount FROM e_transaktionen WHERE execute ='1'";
                         		
                       my_result = mysql_stmt.executeQuery(query_str);
                       my_result.last();
                          		
                       int rowcount = my_result.getRow();
                          		
                       if (rowcount > 0)
                       {
                         query_str = "SELECT sid, adrnr, typ, wert FROM e_transaktionen WHERE execute='1'";
                         my_result = mysql_stmt.executeQuery(query_str);
                         while(my_result.next()) 
                         {   
                              String artikel = my_result.getString("wert");
                          	String sid = my_result.getString("sid");            			 
                          		
                          	Statement ads_stmt = ads_con.createStatement();
                          				
                          	// Lagerbestand in der ADS DB Abfragen            				
                          	query_str = "SELECT bestand FROM lager WHERE artnr='" + artikel + "'";
                          	ad_result = ads_stmt.executeQuery(query_str);
                          	while(ad_result.next())
                          	{
                                  int bestand = ad_result.getInt("bestand");
                                  // Mysl Datensatz updaten
                                  query_str = "UPDATE e_transaktionen SET lagerbestand ='" + bestand + "', execute = '2' WHERE sid = '" + sid + "'";            				
                                  mysql_upda.executeUpdate(query_str);
                              }
                         }
                       }
                
                   try {
                       Thread.sleep(50);
                   } catch (InterruptedException ex) {
                       ex.printStackTrace();
                   }
                   i++;
            }
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
   }

Auf meiner Gui instanziere ich die Klasse dann. Über den Button1 wird der Thread gestartet, über Button2 beendet.

Wie kann ich aber den nun von meiner MyThread Klasse Statusinfos ins Gui(TextArea) ausgeben?
 
Zuletzt bearbeitet:
Mittels einer Referenz, die du z.B. dem Konstruktor übergibst.

Code:
class MyThread extends Thread
 {
  TextArea textArea;

  public MyThread(TextArea textArea) {
    this.textArea = textArea;
  }

  public void run() {
    this.textArea.append...
 
  ...
 
Zurück