# SAF und SQLServer gehen plötzlich nicht mehr



## K-Man (9. Mai 2011)

Hallo zusammen.
Ich nutze seit Jahren Swing Application Framework und bei einigen Programmen bau ich eine Verbindung zu einer Datenbank auf. Das hat bis jetzt auch ohne Probleme funktioniert. Doch plötzlich geht es seit ein paar Tagen bei keiner Software und keinem PC mehr. Es wurde nichts verändert. Weder auf dem SQL-Server, noch auf den Clients. Ich hab das Problem schon etwas eingeschränkt.

Wenn ich in der main-Methode gleich die Verbindung aufbaue, dann klappt es super und ich kann Abfragen starten. Sobald ich es aber in initialize, startup oder später einbaue, dann hängt es sich immer beim Verbindungsaufbauen auf. Es kommt keine Fehlermeldung. Wenn ich debugge, dann geht die Anwendung bis zu der Zeile "Connection result = di.driver.connect(url, info);" im DriverManager und bleibt hängen.
Hier der Code:

```
try
        {
            SAXBuilder builder = new SAXBuilder();
            Document doc = builder.build(new File(CONFIG_FILE));
            Element root = doc.getRootElement();

            String server = root.getChildText(SERVER);
            String database = root.getChildText(DATABASE);

            Class.forName("net.sourceforge.jtds.jdbc.Driver");

            _con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + server + "/" + database, _user, _password);
        }
        catch (Exception ex)
        {
            Logger.getLogger(OperatorSuite2App.class.getName()).log(Level.SEVERE, null, ex);
            exit();
        }
```

VIELEN DANK!


----------



## K-Man (10. Mai 2011)

Einen komischen Zusatz habe ich herausgefunden. Wenn ich den Code so lasse und einfach nur in der Main-Methode eine dummy-Verbindung zu einem Server "blablabla" aufbaue, den es natürlich nicht gibt, dann geht auf einmal auch die andere Verbindung. Nehm ich die dummy-Verbindung aus main wieder raus, dann geht es wieder nicht. Die dummy-Verbindung hat nichts mit der anderen Verbindung zu tun und wird auch gleich wieder geshlossen.


----------



## maki (10. Mai 2011)

Kannst du dich mit Telnet auf den SQL Server Port 1433 hängen?
[c]telnet server 1433[/c]

Wenn nciht, hat sich vielleciht etwas am Server geändert, oder am Netzwerk


----------



## K-Man (10. Mai 2011)

Wie gesagt, generell geht es ja noch. Wenn ich die Verbindung in der Main-Methode aufruf, dann geht es auch.
Nur plötzlich geht der oben gepostete Code nicht mehr (Aufruf in der Initialize-Nethode). Manche Programme sind Monate nicht verändert worden und gehen auch plötzlich nicht mehr.


----------



## maki (10. Mai 2011)

Geht der Telnet aufruf oder nicht?

Irgendetwas muss sich ja geändert haben...


----------



## K-Man (10. Mai 2011)

telnet geht nicht, nein. Weiß aber auch nicht, ob es vorher gegangen ist.
Was aber wirklich komisch ist, bei SAF wird ja nach main inizialize und startup aufgerufen. Erfolg die Connection bei initialize und startup, dann geht es nicht. Erfolgt die Connection in main, geht es. Mach ich ne dummy-Connection in main, dann geht plötzlich auch die Connection in initialize oder startup. Womöglich, weil es dann schon einen Connection-Pool gibt.
Verstehst du, was ich meine?

Und jedenfalls aber schon danke


----------



## K-Man (10. Mai 2011)

Auf dem Surver kommt dann folgende Meldung:
Subject: SQL Server Alert System: 'Database Administration - 020' occurred on
DESCRIPTION:	Length specified in network packet payload did not match number of bytes read; the connection has been closed. Please contact the vendor of the client library


----------



## maki (10. Mai 2011)

Wenn telnet nicht geht, ist der Port normalerweise nicht offen, oder das Netzwerk kaputt. (Vorrausgesetzt telnet ist installiert )



> Verstehst du, was ich meine?


Leider nicht wirklich...

Würde da im Ausschlussverfahren rangehen...
- Ist der Port am Server offen und lauscht? (telnet)
Wenn ja, denn:
- Kann man eine JDBC Verdbindung aufbauen? (ggf. ein einfaches Testprogramm schreiben, oder zB. SQLite nutzen)
usw.


----------



## K-Man (10. Mai 2011)

Ein einfaches Testprogramm geht, damit kann ich auf die Datenbank zugreifen.
Wie gesagt, bei den anderen Programmen geht es nur, wenn ich die Verbindung in der main-Methode aufbaue. Versuch ich die Verbindung später aufzubauen (ging monatelang), dann geht es nicht. Bau ich irgendeine dummy-Verbindung in der main auf (die ich auch gleich wieder schließe), dann gehen alle später aufgebauten Verbindungen plötzlich wieder.


----------



## maki (10. Mai 2011)

> Ein einfaches Testprogramm geht, damit kann ich auf die Datenbank zugreifen.


Dann sollte der Server Port offen sein.

Woran merkst du denn "das es nicht geht"?
Gibt es eine Exception?
Dann wäre der Stacktrace hilfreich.

Nachtrag:
hab jetzt erst das hier gelesen:


> Auf dem Surver kommt dann folgende Meldung:
> Subject: SQL Server Alert System: 'Database Administration - 020' occurred on
> DESCRIPTION: Length specified in network packet payload did not match number of bytes read; the connection has been closed. Please contact the vendor of the client library


----------



## K-Man (10. Mai 2011)

Ich merk es beim debuggen. Es wird kein Fehler geworfen. Aber wenn beim DriverManager Driver.connect aufgerufen wird, dann geht nichts mehr weiter. Als würde es sich einfach aufhängen. Was ich aber nicht verstehe, warum es dann aber geht, wenn ich eben kurz vorher in der main diese dummy-Verbindung aufbau. Beide Verbindungen haben nichts gemeinsam und die dummy-Verbindung wird auch gleich wieder geschlossen.

```
public static void main(String[] args)
    {
       Connection con = null;
        try
        {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:jtds:sqlserver://sfdsd");
        }
        catch (Exception ex)
        {
            ex.printStackTrace();
        }
        finally
        {
             con.close();
        }
                
        launch(OperatorSuite2App.class, args);
    }
[/Java]
Wenn ich sowas mache, dann geht plötzlich auch die Verbindung, die ich später aufbaue. Ohne die dummy-Verbindung hängt es sich eben bei dieser späteren Verbindung auf. Und das eben plötzlich in mehreren verschiedenen Anwendungen, an denen eben nichts geändert wurde.
```


----------



## K-Man (12. Mai 2011)

Vllt etwas mehr Code, damit ihr es besser versteht

```
public static void main(String[] args)
    {
        Connection con = null;
        try
        {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            con = DriverManager.getConnection("jdbc:jtds:sqlserver://xyz");
        }
        catch (Exception ex)
        {
        }
        finally
        {
            if (con != null)
            {
                try
                {
                    con.close();
                }
                catch (Exception ex)
                {
                }
            }
        }
        launch(OperatorSuite2App.class, args);
    }
```


```
protected void initialize(String[] args)
    {
        super.initialize(args);
        new LoginDialog(null, true, this).setVisible(true);
        try
        {
            SAXBuilder builder = new SAXBuilder();
            Document doc = builder.build(new File(CONFIG_FILE));
            Element root = doc.getRootElement();

            String server = root.getChildText(SERVER);
            String database = root.getChildText(DATABASE);

            Class.forName("net.sourceforge.jtds.jdbc.Driver");

            _con = null;

            _con = DriverManager.getConnection("jdbc:jtds:sqlserver://" + server + "/" + database, _user, _password);

            _server = server;
        }
        catch (Exception ex)
        {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
            exit();
        }
    }
```

Normal wird in der Main nur "launch" aufgerufen und so hat es bis jetzt immer geklappt. Aber wie gesagt, geht die Verbindung in der initialize methode plötzlich nicht mehr. Wenn ich jetzt in der Main die oben gezeigte dummy-Verbindung aufbaue, dann geht auf einmal auch die Verbindung in der initialize wieder. Total komisch


----------



## maki (12. Mai 2011)

Ich hoffe, Code wie dieser steht nur im Forum (obwohl,  nicht mal hier ist das ok ) und nicht in deinem echten Programm, sonst brauchst du dich nicht über fehlende Fehlermeldungen beschweren:

```
catch (Exception ex)
        {
        }
```

Nachtrag: Ist ja nur für dein (funktonierendes) Testprogramm 

Sehe da ehrlich gesagt nix was auf einen Fehler hindeuten könnte...


----------



## K-Man (12. Mai 2011)

Ich habs nur fürs Forum rausgenommen, damit es besser leslich ist. Er wirft da auch keine Fehlermeldung.
Das ist ja das komische und daran verzweifle ich mittlerweile. Der Code hat bei mehreren Programmen bis jetzt ohne Probleme funktioniert. Meine Kollegen wissen auch nicht, dass im Netzwerk oder auf den Servern etwas verändert wurde.

Noch seltsamer, die Verbindungen die ich in main aufbaue, gehen IMMER. Nur die Verbindung in initialize gehen seit ein paar Tagen nur noch, wenn ich zuvor irgendeine Verbindung in main aufbaue.


----------



## maki (12. Mai 2011)

Ich kenne das SAF nicht, kann es sein, dass es da eine "Spezialität" bzw. Einschränkung beim Classloader gibt was initialize/startup betrifft? 
Ändert sich etwas, wenn du das Class.forName weglässt?


----------



## K-Man (12. Mai 2011)

Eigentlich sollte es keine Einschränkung geben, es ging ja die Jahre zuvor auch mit dem selben Code ohne Probleme. Das Programm hängt sich ja erst da auf:
DriverManager.getConnection("jdbc:jtds:sqlserver://" + server + "/" + database, _user, _password);
Genauer gesagt, wenn im DriverManager versucht wird "driver.connect" aufzurufen, dann bleibt es einfach stehen. Es wird keine Exception geworfen, nichts abgebrochen. Einfach nichts, es bleibt hängen.


----------



## K-Man (13. Mai 2011)

Ich glaube, es liegt am SAF. Ich hab jetzt mal eine neue Testanwendung gemacht. Einfach mit Netbeans eine neue SAF-Anwendung gemacht und in initialize versucht eine Verbindung aufzubauen. Wieder genau dasselbe Problem. Nur warum geht es jetzt plötzlich nicht mehr?


----------



## maki (13. Mai 2011)

Änderst du in deiner Anwendung irgendwas am Netzwerk? (Proxyeinstelllungen etc.)

Wenn su sagst "bleibt hängen", hängt es dann wirklich "ewig"? Bestimmte Netzwerkoperationen wie DNS Lookup etc. können sehr lange brauchen wenn etwas am netzwerk nicht stimmt, würde da mal ein paar Stunden warten, vielleicht kommt ja doch noch eine Exception über Nacht zB.

Vielleicht mal mit Wireshark dranghängen.


----------



## K-Man (13. Mai 2011)

Ja es bleibt wirklich hängen.
Vielen Dank, werd es mal testen


----------



## K-Man (13. Mai 2011)

Tatsächlich. Ich hab es jetzt mal ca eine Stunde laufen lassen, und es kam eine Fehlermeldung.

SCHWERWIEGEND: null
java.sql.SQLException: Network error IOException: Connection reset
        at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:410)
        at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
        at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
        at java.sql.DriverManager.getConnection(DriverManager.java:582)
        ....
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:168)
        ...


----------



## maki (13. Mai 2011)

Wenn ich davon ausgehe, dass [c]server[/c] stimmt (bitte prüfen, die meiste Zeit bei der Fehlersuche geht drauf weil man von falschen Annahmen ausgeht), ist es wohl ein Netzwerk Problem.

Ändert sich etwas, wenn du den Wert für [c]server[/c] und [c]database[/c] hardcodiert (nur zum testen) einträgst und den SAXBuilder komplett weglässt?
Wenn nicht, ist es wohl Zeit für Wireshark...


----------



## K-Man (13. Mai 2011)

Ich hab es schon öfters hardgecoded, hat nichts gebracht. Auch das Weglassen des SaxBuilders.
Dann probier ich mal Wireshark.
Komisch ist es halt trotzdem noch, dass der Code trotzdem geht, wenn ich vorher in der main eine dummy-Verbindung aufbaue. Aber danke


----------



## K-Man (13. Mai 2011)

Also ich horche auf tcp und Port 1433.
Ist es normal, dass ich immer wieder ein tcp-keep-alive auf den sql-server bekomme, auch wenn das programm noch gar nicht gestartet hat?


----------



## K-Man (13. Mai 2011)

Ok hab mich geirrt.
Ich starte Wireshark auf Port 1433 und es kommen keine Pakete durch. Starte ich das Programm, dann kommen keine Pakete. Auch nach mehreren Minuten nicht. Ich warte mal, bis die Fehlermeldung "connection refused" wieder kommt.

Wenn ich aber wie im Thread schon beschrieben die dummy-Testverbindung aufbaue, dann geht ja alles und ich bekomm viele Pakete und erfolgreiche Übermittlungen.


----------



## mvitz (13. Mai 2011)

Es hilft dir jetzt zwar nicht unbedingt, aber die Klasse Application hat folgendes Javadoc:


```
...
/**
 * The base class for Swing applications.
 * <p/>
 * This class defines a simple lifecyle for Swing applications: {@code
 * initialize}, {@code startup}, {@code ready}, and {@code shutdown}.
 * The {@code Application's} {@code startup} method is responsible for
 * creating the initial GUI and making it visible, and the {@code
 * shutdown} method for hiding the GUI and performing any other
 * cleanup actions before the application exits.  The {@code initialize}
 * method can be used configure system properties that must be set
 * before the GUI is constructed and the {@code ready}
 * method is for applications that want to do a little bit of extra
 * work once the GUI is "ready" to use.  Concrete subclasses must
 * override the {@code startup} method.
 * <p/>
...
```

Hierbei handelt es sich generell ja nur um die GUI und da gehört der Verbindungsaufbau zu einer Datenbank sowieso nicht hin. Bevor du da jetzt noch Stunden suchst, würde ich den Verbindungsaufbau einfach vorher machen.


----------



## K-Man (13. Mai 2011)

Wie gesagt, es hat ja bis jetzt immer geklappt und in den Tutorials steht ja auch immer, dass initialize perfekt geeignet ist um zb Datenbankverbindungen aufzubauen.

Das Programm hat jetzt übrigens wieder mit connection refused abgebrochen und im Wireshark kam nichts. Keine einzige Zeile. Als würde es schon im Treiber hängen und der Treiber nicht mal versuchen, ins Netzwerk zu gehen. Warum auch immer.


----------



## K-Man (16. Mai 2011)

Weiß vllt jemand mehr? Wie gesagt, Wireshark gibt mir keine einzige Zeile aus, wenn ich in initialize die Verbindung aufbaue. Also gehe ich davon aus, dass es weder am Server, noch am Netzwerk liegt. Aber dann muss es am Client liegen. Da es monatelang ohne Probleme ging, schließ ich Fehler in der Programmierung auch aus.
Ich bin hier ziemlich sprachlos.


----------



## K-Man (17. Mai 2011)

Sehr seltsam. Letzte Woche ging es weder auf WinXP, noch auf Win7 Rechner. Seit heute scheint es zumindest auf WinXP-PCs wieder zu gehen.
Möglicherweise ein Problem mit ntlmauth.dll oder jdts?


----------



## maki (17. Mai 2011)

Würde mal die Admins fragen ob updates gemacht wurden.


----------



## K-Man (17. Mai 2011)

Updates wurden keine gemacht.


----------



## K-Man (20. Mai 2011)

Ich hab die Lösung gefunden. Schuld waren Proxyeinstellungen in den Internetoptionen. Es wurde eine Software installiert, die die Proxyeinstellungen ändert bzw überhaupt erst einen Proxy hinzufügt. Nehm ich den Proxy raus, dann geht alles wunderbar. Aber warum versucht Java bzw SAF auf 8080 zuzugreifen und warum stört es dem Programm nicht, wenn es eine dummy-Verbindung in main gibt? Dann geht aus auch mit proxy ohne Probleme.


----------

