SQL mit Timer spalten abfrage

Hallo zusammen,
wer kann mir bei meinem Problem kurz zu Hand gehen. Und zwar
kann ich nur 153 mal SQL spalte abrufen danach bekomme ich NulPointerException fehler Meldung

Orginal Fehler Meldung:
Exception in thread „AWT-EventQueue-1“ java.lang.NullPointerException
at help_src.SQLConnected.getEinzelNr(SQLConnected.java:50)

zeile 50 (st = (PreparedStatement) conn.prepareStatement(query):wink:

Feld Länge ist auf 250 fest gelegt bis 250 kann ich auch ohne Probleme updaten.
wie gesagt kann aber nur max 153 abfragen.
im bereich der SQL bin ich Neuling Programmierung über java.

Für eine Idee oder Belehrung bin ich dank bar.
Gruß
blacksea

Hallo blacksea, willkommen in unserem Forum.

leider kann ich dir so keinen Hinweis geben woran es liegt, denn nur eine Zeile Code hilft nur recht wenig.

Wenn das wirklich die Fehlermeldung ist und die korrekte Zeile, beduetet das, dass conn an der stelle null ist.

Vl kannst du etwas mehr Code zeigen und ich verstehe auch nicht was du mit " nur max 153 abfragen" meinst.

LG
Amunra

Hallo AmunRa
hier ist mein Code:

 public void getEinzelNr() throws SQLException, java.sql.SQLException {
        Connection conn = getConnection();
        String query = "SELECT * FROM wertesoll";
        PreparedStatement st;
        ResultSet rs;
         
        st =  (PreparedStatement) conn.prepareStatement(query);
        rs = st.executeQuery();
        while (rs.next()){
            SQLProfilDatenNr.setEinzelnr(rs.getInt("einzelabruf"));
        }
        st.close();
        rs.close();
    }

mir ist der Fehler erst auf gefallen nach dem ich Timer Methode aufgebaut habe
Code:

private void sqlTimer(){
        SQLConnected con = new SQLConnected();
             
         new Timer(1000, (ActionEvent e) -> {
             try {
                 con.getEinzelNr();
                 lblCount.setText(String.valueOf(SQLProfilDatenNr.getEinzelnr()));
             } catch (SQLException ex) {
                 Logger.getLogger(DisplayMain.class.getName()).log(Level.SEVERE, null, ex);
             }           
        }).start();
    }

die werte kann ich über mein App ändern kein Problem. Die geänderten werte werden auch am Fenster Angezeigt. So weit so gut Funktioniert es.!
old

nach Update

new|500x420

aber dann nach 2 min 38sek: Fehler meldung

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
	at help_src.SQLConnected.getEinzelNr(SQLConnected.java:50)
	at displaywindow.DisplayMain.lambda$sqlTimer$0(DisplayMain.java:42)
	at javax.swing.Timer.fireActionPerformed(Timer.java:313)
	at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
	at java.awt.EventQueue.access$500(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:709)
	at java.awt.EventQueue$3.run(EventQueue.java:703)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
	at org.GNOME.Accessibility.AtkWrapper$6.dispatchEvent(AtkWrapper.java:705)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Ps. das meine ich mit 153 mal

Ausgabe

test 1
test 2
test 3
test 4
test 5
test 6
test 7
test 8
test 9
test 10
test 11
test 12
test 13
test 14
test 15
test 16
test 17
test 18
test 19
test 20
test 21
test 22
test 23
test 24
test 25
test 26
test 27
test 28
test 29
test 30
test 31
test 32
test 33
test 34
test 35
test 36
test 37
test 38
test 39
test 40
test 41
test 42
test 43
test 44
test 45
test 46
test 47
test 48
test 49
test 50
test 51
test 52
test 53
test 54
test 55
test 56
test 57
test 58
test 59
test 60
test 61
test 62
test 63
test 64
test 65
test 66
test 67
test 68
test 69
test 70
test 71
test 72
test 73
test 74
test 75
test 76
test 77
test 78
test 79
test 80
test 81
test 82
test 83
test 84
test 85
test 86
test 87
test 88
test 89
test 90
test 91
test 92
test 93
test 94
test 95
test 96
test 97
test 98
test 99
test 100
test 101
test 102
test 103
test 104
test 105
test 106
test 107
test 108
test 109
test 110
test 111
test 112
test 113
test 114
test 115
test 116
test 117
test 118
test 119
test 120
test 121
test 122
test 123
test 124
test 125
test 126
test 127
test 128
test 129
test 130
test 131
test 132
test 133
test 134
test 135
test 136
test 137
test 138
test 139
test 140
test 141
test 142
test 143
test 144
test 145
test 146
test 147
test 148
test 149
test 150
test 151
test 152
Exception in thread „AWT-EventQueue-1“ java.lang.NullPointerException

Kann es sein, dass du tatsächlich 153 connections öffnest?
da ich in deiner Methode nirgends ein conn.close sehe.

Probier mal folgendes

public void getEinzelNr() throws SQLException, java.sql.SQLException {
        String query = "SELECT * FROM wertesoll";
        try(
          Connection conn = getConnection();
          PreparedStatement st  =  (PreparedStatement) conn.prepareStatement(query);
          ResultSet rs =  st.executeQuery();
         ) {
           while (rs.next()){
              SQLProfilDatenNr.setEinzelnr(rs.getInt("einzelabruf"));
          }
        }
    }


dieses seltsame try-Konstrukt, dass ich hier eingebaut habe, nennt sich try-with-resources (solltest du googlen) und garantiert, dass auch im Fehlerfall conn, st und rs geschlossen werden.

Meine Vermutung ist, dass du 153 connections zur Datenbank öffnest und danach deine DB sagt, mehr darfst du nicht verwenden. Daher ist conn dann null und du erhältst die NullPointerException. Welche db verwendest du?

LG AmunRa

@blacksea Tipp: Immer so viel Code zeigen, dass man das Problem nachvollziehen kann. Ganz richtig, das ResultSet und das PreparedStatement müssen geclosed werden. Eine Connection darf wiederverwendet werden. Viel Glück noch.

Hai AmunRa

try-Konstrukt habe ich zum test zwecken raus genommen.
als ich fest stellte das das nichts damit zun tun hat, habe ich den Code vorerst so belassen.
Meine Vermutung ist auch wie so öffnet sich die Connection 153. zum Datenbank.???.:expressionless:

Dank dir habe ich jetzt mein Flüchtigkeitsfehler entdeckt.
Flüchtigkeitsfehler ist .conn.close();

also danke dir nochmals

Die „try-Konstrukte“ (offiziell: „try with resources“ oder auch ARM = „automatic resource management“) sorgen doch gerade dafür, dass deine Connection sauber geschlossen wird, da wird implizit ein close() aufgerufen.:

try(Connection conn = getConnection()) {
      //verwende connection
}
//hier isse zu, egal was war

Übrigens: Wenn du Code nicht so testen kannst, wie du ihn dann verwenden willst, machst du etwas falsch.

Hai Landei

Ich gebe zu ist peinliche Aktion habe vergessen Connetion zu schließen.

jetzt läuft alles wie gewünscht. :+1:

Hallo blacksea

Sehr gut dass wir dir helfen konnten und du deine Fehler gefunden hast.

Was Landei wohl meinte und was auch ich dir sehr nahelegen möchte ist, dass du statt manuell connection.close aufzurufen, du dich mit try-with-resources vertraut machen solltest.

Es ist eigentlich ziemlich viel Arbeit alle Sonderfälle die man beim Ressourcenmanagement beachten muss, auch korrekt zu implementieren und man kann (wie es dir passiert ist) sehr leicht etwas übersehen. Dieses Java-feature erleichtert das Entwickeln ungemein. Bitte nicht falsch verstehen, sondern nur als Denkanstoß und Hinweis für die Zukunft sehen.

LG
Schönen Sonntag
AmunRa

Hallo AmunRa

Für jede Idee oder für perfekte Lösungen bin ich immer dankbar. Man kann immer noch was dazu lernen
Eure Empfehlung habe ich angewandt.
Einfach perfekt
Danke an euch