2017-04-22 4 views
0

Ich hatte eine Frage zu dem Code, den ich ausführe. Es ist beabsichtigt, eine Anzeige basierend auf einem Wert einer Variablen, die aus einer SQL-Datenbank abgerufen wird, zu aktualisieren. Wenn ich den Code ausführe und einen anderen Eintrag in die Tabelle einfüge, ändert sich die Schleife, die die Werte der Tabelle druckt, nicht. Ich bin mir nicht sicher, ob dies der Fall ist, weil der Zeiger in der Tabelle nicht verschoben wurde oder weil der Code eine dynamische Aktualisierung nicht zulässt. Wenn ich den Code beende und erneut lese, werden neue Daten angezeigt. Ich benutze Eclipse.Aktualisieren einer SQL-Datenbank zwischen Abfragen?

import java.awt.Graphics; 
import javax.swing.JFrame; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 

public class Tutorial1 extends JFrame 
{ 
    static String State; 
     public Tutorial1() 
     { 
      setTitle("Tutorial1"); 
      setSize(900, 900); 
      setVisible(true); 
      setDefaultCloseOperation(EXIT_ON_CLOSE); 
     } 

     public void paint(Graphics g) 
     { 


      if (State.equals("0")) 
      { 
      g.drawRect(480, 480, 200, 100); 
      } 

      if (State.equals("1")) 
      { 
      g.fillRect(240, 240, 200, 100); 
      } 


     } 


     public static void main(String[] args) 
     { 

      Connection conn = null; 
      Statement stmt = null; 
      ResultSet rs = null; 
      try { 
       new com.mysql.jdbc.Driver(); 
       Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        String connectionUrl = "jdbc:mysql://localhost:3306/capstone"; 
       String connectionUser = "root"; 
       String connectionPassword = "root"; 
       conn = DriverManager.getConnection(connectionUrl, connectionUser, connectionPassword); 
       stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 
       rs = stmt.executeQuery("SELECT id,Name,State FROM Sensors ORDER BY id DESC"); 

       {  

       while (rs.next()) { 


        Tutorial1 t = new Tutorial1(); 
        //t.paint(null); 

        while (true) 
        { 

         rs.refreshRow(); 
         rs.updateRow(); 


         String id = rs.getString("id"); 
          String Name = rs.getString("Name"); 
          State = rs.getString("State"); 
          System.out.println("ID: " + id + ",Name: " + Name 
            + ", State: " + State); 

          id = "id+1"; 

         System.out.println("Success"); 
         System.out.println(State); 

         t.repaint(); 

        } 

       } 


      } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } finally { 




       //try { if (rs != null) rs.close(); } catch (SQLException e) { e.printStackTrace(); } 
      // try { if (stmt != null) stmt.close(); } catch (SQLException e) { e.printStackTrace(); } 
       //try { if (conn != null) conn.close(); } catch (SQLException e) { e.printStackTrace(); } 
      }    
     } 
} 
+0

Wenn Sie nicht auf die while (true) Schleife beziehen sich die Werte zu aktualisieren, dann ist das das richtige Verhalten, da die Ergebnisse bereits aus der Datenbank abgerufen werden. Sollten Sie neue Ergebnisse von der Datenbank benötigen, müssen Sie die Datenbank erneut abfragen. –

+1

Das 'while (true)' Aussehen wird sich wie verrückt drehen. Sie sollten es wirklich drosseln oder Sie haben Tausende von Repaints mit veralteten Daten in der Warteschlange. – tadman

+0

@tadman Was wäre ein effizienter Weg, um die Schleife alle 10 Sekunden auszuführen? –

Antwort

0

Also, was eigentlich Ihr Code tut, ist die folgende:

  1. Sie führen eine Abfrage mit der folgenden Aussage:

    rs = stmt.executeQuery("SELECT id,Name,State FROM Sensors ORDER BY id DESC");

    jetzt Ihre resultset hält das Ergebnis der die Abfrage, und die erste Zeile in der resultset ist die mit der höchsten id.

  2. Dann gehen Sie in der ersten Zeile der resultset:

    while (rs.next())

  3. Danach Sie ständig erfrischend, dass bestimmte Zeile in einer Endlosschleife:

    while (true) { rs.refreshRow(); ...

Sie nie in der nächsten Zeile bewegen (nie wieder rs.next() genannt wird) noch Sie jemals irgendwelche neue eingefügten Zeilen in der Tabelle sehen (Sie sind nicht Auffrischen die ganzeresultset - nur die aktuelle Zeile)

Of natürlich, wenn Sie Ihr Programm stoppen und erneut ausführen - Abfrage ausgeführt wird, liest sie die neuen Werte aus der Tabelle, wobei die erste Reihe mit dem höheren id und so sehen Sie das erwartete Ergebnis auf dem Bildschirm.

Deshalb ist das Beste, was zu tun ist, schließen Sie einfach das Ergebnismenge. Und führen Sie eine Abfrage erneut aus - wenn Sie neue Werte aus der Tabelle erhalten möchten.

Auch, wie von der tadman in Kommentaren erwähnt - Sie sollten zwischen erneuten Abfragen anhalten, indem Sie sleep auf den Thread verwenden.

+0

macht ich dies an einem Punkt hatte und es nicht –

+0

@DavidCamille ich tatsächlich etwas bemerkt jetzt nicht funktioniert - das bringt mich auf eine Frage - Wie viele Einträge gibt es in Ihrer 'Sensoren' Tabelle? Weil du es behandelst, als hätte es nur einen einzigen Eintrag, der gerade ständig aktualisiert wird ...Wenn es nicht der Fall ist, möglicherweise, das ist die Quelle Ihres Problems ... Auch Tadmans Sorge ist legit ... – Plirkee

+0

@DavidCamille meine Antwort bearbeitet - werfen Sie einen Blick. – Plirkee

Verwandte Themen