# Socket write error



## Alex_winf01 (2. Jul 2009)

Hallo liebe Forengemeinde,

ich habe ein kleines Programm geschrieben. Mit folgender Methode lasse ich den Anwender sich an der Datenbank anmelden:


```
public static void anmelden(String angemeldeter_User, String pwd)
	{
		try
               {
        	lesen();
        	Class.forName("org.h2.Driver"); // Treiber laden
    		String connection_string = "jdbc:h2:tcp://" + ergebnis[0] + "/test"; /** In connection_string wird der String für die Connection gespeichert**/
    		connection = DriverManager.getConnection(connection_string, angemeldeter_User, pwd);
    		boolean angemeldet = true; /** in angemeldet wird gespeichert, ob angemeldet wurde (true) oder nicht (false)**/
	    	Update.updateAnwender(angemeldet, angemeldeter_User); // Anwender in Tabelle "Anwender" anmelden
	    	DatenLaden(); // entsprechende Daten laden
			
			if(angemeldeter_User.equals("sa"))
			{
				JOptionPane.showMessageDialog(null, copyright, "Copyright", JOptionPane.INFORMATION_MESSAGE);
			    StartFrame frm = new StartFrame("Artikel-Bestellung); /**frm stellt das Objekt StartFrame (das Fenster) dar**/
				frm.setVisible(true);
				frm.setResizable(false); // verhindern, dass der Anwender die Größe des Fensters verändert
				frm.setExtendedState(JFrame.MAXIMIZED_BOTH); // auf Vollbildschirm schalten
				frm.pack();
				DatenLaden(); // Daten laden
				stammdatenbearbeiten_deaktivieren();
			}
			else
			{
				JOptionPane.showMessageDialog(null, copyright, "Copyright", JOptionPane.INFORMATION_MESSAGE);
				Fragebogen frm = new Fragebogen("Artikel");
				frm.setVisible(true);
				frm.setResizable(false); // verhindern, dass der Anwender die Größe des Fensters verändert
				frm.setExtendedState(JFrame.MAXIMIZED_BOTH); // auf Vollbildschirm schalten
				frm.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); // verhindern, dass die Basisdokumentation über Abbruch (X) geschlossen wird
				frm.pack();
				Fragebogen.doku_deaktivieren();
			}
			
		}
		
		catch(Exception e)
		{
		   JOptionPane.showMessageDialog(null, "Sie haben ein falsches Passwort eingegeben " + e,
			"DB-Meldung", JOptionPane.ERROR_MESSAGE);
			
			Login log = new Login("DB-Anmeldung");
			log.setVisible(true);
			log.setSize(50,50);
			log.setLocation(300, 300);
			log.pack(); 
		}
	}
```

Für die Anwendung muss ich noch ein paar Daten aus der Datenbank laden, die der Anwender angezeigt bekommt:


```
private static void DatenLaden()
	{
		try
		{
			lese = "Select * from artikel ORDER BY artikel_nummer DESC";
			stmt = connection.createStatement();
			result = stmt.executeQuery(lese.toString());
			
			lese_dokumentation = "Select * from bestellung ORDER BY bestell_nummer DESC";
			stmt1 = connection.createStatement();
			result_dokumentation = stmt1.executeQuery(lese_dokumentation.toString());
			
		}
		catch(SQLException a)
		{
			JOptionPane.showMessageDialog(null, "Es ist folgender Fehler aufgetreten: " + a,
				"DB-Meldung", JOptionPane.ERROR_MESSAGE);
		}
	}
```

Die Anwendung lief jetzt 1 Jahr beim Kunden ohne Probleme. Im Hintergrund läuft eine H2-Datenbank, die auf einem W2000 SP4-Server installiert ist. Der H2-Server ist so eingestellt, dass es erlaubt ist, dass sich mehrere Leute gleichzeitig an der Datenbank anmelden können. Die H2-Datenbank ist auf einem Windows 2000 Server mit SP4 installiert. Der Fehler tritt dann auf, wenn 5 Computer sich gleichzeitig anmelden. Beim 6. Computer tritt dieser Fehler auf - ohne dass was an der Anwendung weiter gemacht wird.

Woran könnte das liegen?


----------



## angelchr (6. Jul 2009)

hi,

welcher Fehler tritt auf? bzw welche Exception wird geworfen?
Ich gehe mal stark davon aus, daß die Anzahl der max. Verbindungen der DB auf 5 beschränkt ist.


----------



## Alex_winf01 (6. Jul 2009)

@ angelchr

Es tritt ein java.net.SocketException: 


```
Connection reset by peer: socket write error
at java.net.SocketOutputStream.socketWrite0
at java.net.SocketOutputStream.socketWrite
at java.net.SocketOutputStream.write
at java.io.BufferedOutputStream.flushBuffer
at java.io.BufferedOutputStream.flush
at java.io.DataOutputStream.flush
at org.h2.value.Transfer.flush
at org.h2.server.TcpServerThread.sendError
at org.h2.server.TcpServerThread.run
```

Vorher haben sich auch mehr wie 6 Leute ohne Probleme anmelden können. Ich habe das Problem einschränken könnnen: Dieser Fehler tritt in Verbindung mit einem Fehler des JavaHeapSpace auf. D. h. der HeapSpace läuft über. 

Zur Erläuterung: Sobald der Anwender sich anmeldet, werden in einer JList Daten geladen mit einer Fall-Nummer und Anzahl. Jeder Eintrag in der Liste stellt ein Objekt dar. Nun sind in der Zwischenzeit über 2.000 Datensätze in der Datenbank. Da kann ich mir sehr gut vorstellen, dass genau das das Problem ist. 2.000 Objekte mal 5 Anwender - da knallt es relativ schnell.


----------

