MySQL SQL Abfrage erneut ausführen oder rs aktualisieren

nonickatall

Mitglied
Hallo ich habe eine Klasse die auf einem MySQL Server nach neuen Einträgen in einer Tabelle sucht. Das Ganze will ich in einem While() laufen lassen um permanent zu pollen.

Jedoch ist das Problem, dass das einmal gebildete Objekt und das ResultSet beim nächsten Durchlauf nicht aktualisiert werden, obwohl der in Hintergrund gelöschte Datensatz gar nicht mehr existiert. Nehme ich den loop für Testzwecke raus, dann ist beim nächsten Start alles wie es sein soll.

Ich kann ja nicht bei jedem Lauf die Objektvariable hochzählen. Gibt es eine Möglichkeit das Objekt s oder das ResultSet rs so zu killen, damit es beim nächsten Durchlauf erneut erzeugt wird?

s = null; oder rs = null; bewirken nichts.

Java:
package myhome;

import java.sql.*;
import java.util.Arrays;

public class Eventmgr {
    private static boolean loop = false;
    private static int loop_count = 2;
    private static String in_id;
    private static String in_nummer;
    private static String in_text;
    private static String in_typ;
    
    public static void start() throws SQLException {
        
        //Verbindung zum SQL-Server herstellen
        
        while(loop_count > 0) {
            //Loop an oder aus für Testzwecke
            if (loop == false) {
                loop_count = loop_count -1;}
            
            //SQL Neue Datensätze holen   
            SQL s = new SQL();             
            s.connect();
            ResultSet rs = s.abfrage("select id, nummer, text, typ from inbox order by id asc limit 1") ;
            while(rs.next()) {
                in_id = rs.getString("id");
                in_nummer = rs.getString("nummer");
                in_text = rs.getString("text");
                in_typ = rs.getString("typ");}
            s.close();
            System.out.println(in_nummer);
            
            // [Entscheiden welche Art Datensatz es ist]
            if (in_typ != null) {
                if (in_typ.contains("SMS")) {
                    //SMS:
                    //Prüfen ob der Berechtigte existiert, der oder die Befehle gültig sind und die Rechte dazu existieren.
                    Befehle.extrahieren(in_id, in_nummer, in_text);}   
        
                else if (in_typ.contains("intern")) {
                    //intern
                    Befehle.extrahieren(in_id, in_text);}   
        
                else if (in_typ.contains("@")) {
                    //@Befehl@
                    Befehle.extrahieren_lang(in_id, in_nummer, in_text);}
                }
            
            //rs = null;
            System.out.println(s);
            }
    }
}

Vielen Dank im Voraus

Ralf
 

Dukel

Top Contributor
Ich würde die DB Connection vor der Schleife machen und am ende wieder zumachen.
Die Abfrage (und das Result Set) in der Schleife.

Zum schliessen den RS gibt es: close()
 

mihe7

Top Contributor
Durch die Verwendung Deiner SQL-Klasse kann man wenig sagen. Jedenfalls musst Du das ResultSet und das Statement schließen.
 

nonickatall

Mitglied
Danke für die Antworten.

Habe beides probiert bringt aber nichts. Habe die Klasse SQL mal übergangen und direkt implementiert. Vielleicht habt Ihr noch eine Idee woran es liegen kann?

Java:
package myhome;

import java.sql.*;

public class Eventmgr {
    private static boolean loop = true;
    private static int loop_count = 2;
    private static String in_id;
    private static String in_nummer;
    private static String in_text;
    private static String in_typ;
    
    private static Connection connection;
    
    private static String URL = "jdbc:mysql://xxx.xxx.x.x:3306/myhome";
    private static String username = "xxxxx";
    private static String password = "xxxxx";
        
    public static void start() throws SQLException {
        
        //Verbindung zum SQL-Server herstellen
        while(loop_count > 0) {
            //Loop an oder aus für Testzwecke
            if (loop == false) {
                loop_count = loop_count -1;}
        
            
            //SQL Neue Datensätze holen   
            SQL s = new SQL();             
            connection = DriverManager.getConnection(URL, username, password);
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery("select id, nummer, text, typ from inbox order by id asc limit 1") ;
            while(rs.next()) {
                in_id = rs.getString("id");
                in_nummer = rs.getString("nummer");
                in_text = rs.getString("text");
                in_typ = rs.getString("typ");}
            connection.close();
            stmt = null;
            rs.close();
            System.out.println("Loop läuft");

            
            // [Entscheiden welche Art Datensatz es ist]
            if (in_typ != null) {
                if (in_typ.contains("SMS")) {
                    //SMS:
                    //Prüfen ob der Berechtigte existiert, der oder die Befehle gültig sind und die Rechte dazu existieren.
                    Befehle.extrahieren(in_id, in_nummer, in_text);}   
        
                else if (in_typ.contains("intern")) {
                    //intern
                    Befehle.extrahieren(in_id, in_text);}   
        
                else if (in_typ.contains("@")) {
                    //@Befehl@
                    Befehle.extrahieren_lang(in_id, in_nummer, in_text);}
                }
            
            //s = null;
            //rs = null;
            System.out.println(s);
            }
        }
}
 

Dukel

Top Contributor
Wieso baust du jedes mal in der Schleife die Verbindung auf?

Java:
SQL s = new SQL();             
connection = DriverManager.getConnection(URL, username, password);
Statement stmt = connection.createStatement();
while(loop_count > 0) {
    ResultSet rs = stmt.executeQuery("select id, nummer, text, typ from inbox order by id asc limit 1") ;
    ...
    rs.close();
}
stmt.close();
connection.close();
 

nonickatall

Mitglied
Wie kommst Du eigentlich darauf, dass der Datensatz "zwischenzeitlich" gelöscht sein müsste?
Weil ich polle, dann eine Methode in einer Klasse aufrufe, die den Datensatz bearbeitet und zum Schluß löscht. Das funktioniert auch, aber die Schleife vergisst leider nicht...

Starte ich aber neu, ist alles wie es sein soll, bis ich im Hintergrund, von einen anderen Client, wieder einen Datensatz in die Tabelle "schiebe".
 

nonickatall

Mitglied
Wieso baust du jedes mal in der Schleife die Verbindung auf?

Java:
SQL s = new SQL();            
connection = DriverManager.getConnection(URL, username, password);
Statement stmt = connection.createStatement();
while(loop_count > 0) {
    ResultSet rs = stmt.executeQuery("select id, nummer, text, typ from inbox order by id asc limit 1") ;
    ...
    rs.close();
}
stmt.close();
connection.close();
Weil ich gerade herum teste, wie ich das Problem weg bekomme. ;-)
Hatte am Anfang die Connection vor der Schleife. War kein Unterschied.
 

mihe7

Top Contributor

nonickatall

Mitglied
Verstehe, habe die Reihenfolge geändert.

Ich bin ein totaler Depp... Und habe Euch auf eine völlig falsche Fährte geführt. :oops: Liegt wohl daran weil das mein erstes Programm in Java ist und ich noch mit all dem Wissen kämpfe.

Ich prüfe natürlich auf die Variable "in_typ". Wenn die nicht neu gesetzt wird, weil "while(rs.next()){" keinen neuen Datensatz liefert, bleibt natürlich das Ergebnis gleich. Das hatte nichts mit dem ResultSet zu tun...

Ich habe die Variablen am Ende der Schleife nun mit "in_typ = null;" usw. zurück gesetzt. Nun geht es.

@mihe7
Zu dem Thema static...

An welcher Stelle meinst du? Ich kämpfe da noch mit dem Verständnis von static und non static...

Trotzdem vielen Dank an Euch beide für die Hilfe..

LG
Ralf
 
Zuletzt bearbeitet:

nonickatall

Mitglied
Aber in diesem Zusammenhang mal eine andere Frage zum grundsätzlichen Verständnis.

Wenn ich eine statische Klasse aufrufe:

Java:
Befehle.extrahieren(in_id, in_nummer, in_text);

wo ich wiederum eine Connection mit Hilfe einen Objektes zum SQL Server

Java:
SQL s3 =  new SQL();

mache, die was abarbeitet z.B.

Java:
        //User ermitteln
        System.out.println("User ermitteln" );
        SQL s3 = new SQL();
        s3.connect();
        ResultSet rs3 = s3.abfrage("SELECT berechtigter, id from berechtigte WHERE nummer = '" + in_nummer + "'");
        while(rs3.next()) {
            berechtigte_id = rs3.getString("id");
            berechtigte_berechtigter = rs3.getString("berechtigter");}
        s3.close();

und die statische Klasse "Befehle" sich nach Abarbeitung aller Methoden sich selbst automatisch beendet, wenn ich das richtig verstanden habe? Dann habe ich ja die Connection "s3" mit
Java:
s3.close();
bereits wieder beendet. Das ist aus meinem derzeitigen Verständnis deswegen notwendig, weil der MySql Server sonst verwaiste Verbindungen offen hält. Oder?

Aber was ist mit dem Statement "stm" in der Klasse SQL und dem "ResultSet rs3"? Stirbt das automatisch mit, oder muss ich die immer manuell schließen? Denn das sind doch im Grunde Variablen, bzw. Instanzvariablen der Klasse Befehle, bzw. des Objektes s3.

Oder liege ich da falsch?

Vielen Dank im Voraus für Erhellung..
 

mihe7

Top Contributor
Ich prüfe natürlich auf die Variable "in_typ". Wenn die nicht neu gesetzt wird, weil "while(rs.next()){" keinen neuen Datensatz liefert, bleibt natürlich das Ergebnis gleich.
Ah, das hätte ich eigentlich sehen müssen. Ärgerlich.

@mihe7
Zu dem Thema static...

An welcher Stelle meinst du?
Überall, außer bei main, ggf. inneren Typen und Konstanten (static final).

static dient dazu, Variablen, Konstanten, Typen und Methoden zu definieren, die für die Gesamtheit aller Objekte (sprich: die Klasse der Objekte) gelten.
  • Eine statische Variable ist nichts anderes als ein globaler, veränderlicher Zustand; etwas, das man wirklich nicht will.
  • Eine Konstante ist etwas, das man ggf. global im Zugriff haben will. Da sich die Konstante aber nicht ändert, ist das auch in Ordnung.
  • Statische innere Typen sind ok. Sie stellen keinen Zustand dar.
  • Statische Methoden können nur auf statische Variablen/Konstanten zugreifen. Da man statische Variablen nicht möchte, ist ihr Einsatz im Wesentlichen darauf beschränkt, reine Funktionen zu definieren.
  • main muss statisch sein. Die JVM nutzt die Methode als Programmeinstiegspunkt, ohne ein Objekt erzeugen zu müssen.
Auf den neuen Kommentar gehe ich gleich nochmal separat ein, der hat nämlich nichts mit static zu tun :)
 

mihe7

Top Contributor
So, jetzt hat es ein wenig gedauert, nachdem ich hier unterbrochen wurde.

Aber was ist mit dem Statement "stm" in der klasse SQL und dem "ResultSet rs3"? Stirbt das automatisch mit, oder muss ich die immer manuell schließen? Denn das sind doch im Grunde Variablen, bzw. Instanzvariablen der Klasse Befehle, bzw. des Objektes s3.

Oder liege ich da falsch?
Da liegst Du (nicht ganz) falsch. Die Objekte beschreiben in der Regel Ressourcen des SQL-Servers. Es ist nicht so, dass das Connection-Objekt darüber Buch führen müsste, welche Statements Du erzeugen lässt, um automatisch ein close() auszuführen. Die Ressource gibt der SQL-Server spätestens frei, wenn die Verbindung geschlossen wird. Das ist aber kein sauberes Vorgehen und kann durchaus zu Problemen führen, insbesondere, wenn Du mit einer Verbindung viele Statements öffnest. Wenn allerdings ein Objekt in Java Buch führt, dann bekommst Du ein schönes Memory Leak, weil das Objekt vom Garbage Collector nicht abgeräumt werden kann (wenn der Treiber sauber programmiert ist, sollte er dann implizit ein close() ausführen).

Kurz: schließe, was Du geöffnet hast und zwar in umgekehrter Reihenfolge.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
L PostgreSQL Abfrage mit EclipseLink Datenbankprogrammierung 7
S Berechnung des Datumsunterschieds in der SQL-Abfrage Datenbankprogrammierung 1
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
Kirby.exe Verständnisproblem bei SQL Abfrage Datenbankprogrammierung 27
N SQL-Abfrage in JTextField ausgeben Datenbankprogrammierung 6
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
W MySQL DB Abfrage in Array, gemischte Array, generelles vorgehen Datenbankprogrammierung 4
D SQL Abfrage optimieren Datenbankprogrammierung 35
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
D Regelmäßige Abfrage aus Workbench Datenbankprogrammierung 6
M SQL-Statement Hilfe bei SQL-Abfrage Datenbankprogrammierung 2
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
M MySQL Anbindung und Abfrage an die Datenbank Datenbankprogrammierung 2
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
E Abfrage auf HSQLDB Datenbankprogrammierung 4
M MySQL SQL Abfrage in JTable mit Berechnung Datenbankprogrammierung 3
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
S SQL Abfrage Datenbankprogrammierung 2
F Abfrage der letzten Einträge Datenbankprogrammierung 2
J SELECT Abfrage/Suche Datenbankprogrammierung 4
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
OnDemand SQL Abfrage und Equals Datenbankprogrammierung 4
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
M MySQL MySQLSyntaxError in Java, obwohl Abfrage in HeidiSQL korrekt Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
L SQL-Abfrage bricht vor dem Ende ab Datenbankprogrammierung 2
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Derby/JavaDB Komplexe Abfrage vereinfachen Datenbankprogrammierung 2
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
P Datenbank- Abfrage mit null'en Datenbankprogrammierung 2
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
D MySQL Erstellen der richtigen Abfrage Datenbankprogrammierung 3
D MySQL DB Abfrage Prüfen Datenbankprogrammierung 10
D JDBC insert mit select abfrage Datenbankprogrammierung 5
E PostgreSQL Exception too ...many clients already bei DB-Abfrage Datenbankprogrammierung 14
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
H JSON Array abfrage beschleunigen Datenbankprogrammierung 2
S MySQL Abfrage: Wenn Feld leer, alles anzeigen Datenbankprogrammierung 5
Mrtwomoon Abfrage-Ergebnisse in einem Fenster darstellen Datenbankprogrammierung 8
0 SQL Abfrage Bestellung Datenbankprogrammierung 15
G SQLite SQLite Abfrage Datenbankprogrammierung 4
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
B My-SQL Abfrage - Out Of Memory Error Datenbankprogrammierung 13
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
K SQLite Einfache DB-Abfrage Datenbankprogrammierung 2
C Problem mit SQL-Abfrage Datenbankprogrammierung 5
C Sortierung bei SQL-Abfrage Datenbankprogrammierung 3
B Bei Abfrage schießt der Speicher in die Höhe Datenbankprogrammierung 6
M SQL Abfrage Dupliakte bei Kreuzvergleich Datenbankprogrammierung 2
M Access Abfrage mit Parameter & Access/Java liefern unterschiedliche Ergebnisse Datenbankprogrammierung 2
G SQL Abfrage Datenbankprogrammierung 5
C SQL-Abfrage Datenbankprogrammierung 4
B SQL-Abfrage Datenbankprogrammierung 4
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
C Wert in SQL-Abfrage zählen lassen Datenbankprogrammierung 8
R Memory leaks bei DB Abfrage Datenbankprogrammierung 16
S Abfrage auf SQLite-DB Datenbankprogrammierung 2
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G Abfrage von Teilnehmern Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
A MySQL Ergebnss aus SQL Abfrage in Hauptklasse verwenden Datenbankprogrammierung 3
N Geschwindigkeit bei if Abfrage Datenbankprogrammierung 11
J sql abfrage ... Problem mit Datumswert Datenbankprogrammierung 3
G Performante SQL- Abfrage (LIKE %) Datenbankprogrammierung 21
G Join Abfrage Datenbankprogrammierung 12
M db abfrage fehlerhaft Datenbankprogrammierung 5
C MySQL Abfrage mit flexibler WHERE bedingung Datenbankprogrammierung 10
C Datenbank-Abfrage, if im Select Datenbankprogrammierung 9
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
H SQL Abfrage - zwei tabellen vergleichen. Datenbankprogrammierung 2
H MySQL Datenbank Abfrage Datenbankprogrammierung 10
André Uhres SQL Abfrage erkennt keine Buchstaben mit Akzenten (z. B. é, è) Datenbankprogrammierung 3
E MySQL Klasse zur Abfrage statisch oder Standard Datenbankprogrammierung 5
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
G M:N Abfrage Datenbankprogrammierung 2
J where Abfrage auf ein mysql date feld Datenbankprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben