# Session NullPointerException



## PhantomXXL (16. Aug 2005)

Ich hab hier ein Problem mit der Session, und zwar immer wenn das Programm so etwa ne Stunde am Server rennt schmeisst plötzlich die SessionVerwaltung ne NullPointerException (auch von anderen PCs aus). Einzige Abhilfe ist es am Server den Tomcat zu beenden und wieder zu starten (aka restart).

einziges was mir eingefallen ist, bei jedem seitenaufruf wird das gemacht. hilft aber irgendwie nicht wirklich weiter und dürfte eigentlich auch keinen einfluss auf "neue" sessions haben indem man nen anderen pc benutzt.


```
session.setMaxInactiveInterval(3600);
```


----------



## Bleiglanz (16. Aug 2005)

was ist "die SessionVerwaltung"

und wo fliegt der Fehler...??


----------



## PhantomXXL (16. Aug 2005)

```
public class SessionVerwaltung {
	
	
	HttpSession session = null;
	HttpServletRequest request = null;
	HttpServletResponse response = null;
	String identity=null;
	String id_benutzer = null;
	String benutzer = null;
	boolean done=false;
	
	
	SessionVerwaltung(HttpServletRequest request, HttpServletResponse response)
	{
		session = request.getSession(true);
		
		this.request = request;
		this.response = response;
		
	}
	
	public boolean SessionPruefung(Statement stmt) throws SQLException, IOException
	{
		
//nachdem der Server ca. ne Stunde rennt gibt die nächste zeile die besagte exception:
		benutzer = session.getAttribute("benutzername").toString();
		String passwort = session.getAttribute("passwort").toString();

		if(benutzer != null && passwort != null)
		{
		//MySQL benutzername prüfen, Id holen -> in Session speichern
		//boolean Variable für return je nach MYSQL Ergebnis
		
			//Verknüpfung benutzername und passwort aus mitarbeiter und aus kunde 			
			ResultSet rs = stmt.executeQuery(" SELECT loginname, passwort, identity, id_benutzer FROM benutzer WHERE benutzer.loginname = '"+benutzer+"' AND benutzer.passwort = '"+passwort+"'"); 
						
				while(rs.next()) {	
					identity = rs.getString("identity");		
					id_benutzer = rs.getString("id_benutzer");
					
					done = true;					
				}							
				rs.close();				
				stmt.close();			
		}
				
		
		if(!done) { 
					session.setAttribute("benutzer_id", "0");
					response.sendRedirect("NichtAngemeldet");
			} 
		return done;
		
	}
	
	public boolean SessionSetzen(Statement stmt, String benutzer, String passwort) throws SQLException, IOException
	{
		session.setAttribute("benutzername", benutzer);
		session.setAttribute("passwort", passwort);
		session.setMaxInactiveInterval(3600);
		return SessionPruefung(stmt);
	}
}
```

hab ihm code dazugetextet wo der fehler is, das sessionprüfen wird bei jeder seite vorher aufgerufen, mit ausnahme der loginpage die amcht sessionsetzen. einfach sobald das erste ma an ne session kommt wirft er nullpointer, obwohl die eigentlich noch gesetzt sein müsste bzw gesetzt wird.


----------



## daLenz (16. Aug 2005)

du setzt das timeout ja auf 1h...wenn dann eine stunde lang nichts neues aufgerufen wird, läuft auch die session ab...wenn du eine längere gültigkeit haben willst musst du das timeout erhöhen...

du kannst das session-timeout übrigens auch auf dem tomcat einstellen...(unter <tomcat-root>\conf\web.xml --> <session-timeout> dort allerdings in minuten angeben)

greetz


----------



## Bleiglanz (16. Aug 2005)

na und

session = request.getSession(true); 

du sollst diese referenz nicht speichern, sondern jedesmal neu holen! und wenn die alte abgelaufen ist, dann wird einfach eine neue erzeugt

und in der neuen gibts keine Attribute...


----------



## PhantomXXL (16. Aug 2005)

naja die session wird nur für die bearbeitung dieser einen seite gespeichert. sobald eine seite geladen wird macht er

```
session=new SessionVerwaltung(blabla,...);
```

und das request is aus der servlet klasse selbst...

das lustige is ja das selbst wenn ich nu von nem anderen pc mit komplett eigener sessiona ufruf (anderes request, neue session... so meien schlussfoglerugn eigentlich) macht er den fehler auch

und das mit der stunde schön und gut, nur es heisst max inaktive intervall, wenn ich abre ne stunde was mache hauts nach der studne trotzdem alles übern haufen


----------



## Bleiglanz (16. Aug 2005)

getAttribute("benutzername").toString(); 

das ist doch der fehler - toString() auf null?

vielleicht ein bug beim erzeugen dieses Attributs? wird das wirklich immer VORHER gemacht


----------



## PhantomXXL (16. Aug 2005)

ja haba uch grad gefunden das da der hacken is ... wenn die session abrennt gibt es dieses attribute nicht mehr
ich mach jez nen cast auf string anstatt dem tostring, dann dürfte auch das null übergeben werden und richtig abgefangen, hoff ich ma ne stunde warten *g* oh ne mist is ja shcon halb 5 na dann morgen ^^

zu meiner verteidigung muss ich dazusagen, das hab nicht ich gemacht sondern eine praktikantin (die zuvor praktisch nur c++ kannte und halt paar wochen in schule java ma angeschnitten hat) *g*


----------



## PhantomXXL (17. Aug 2005)

```
public boolean SessionPruefung(Statement stmt) throws SQLException, IOException
	{
		
		if(session!=null && stmt!=null) {
		
			session.setMaxInactiveInterval(3600);
			String benutzer = (String) session.getAttribute("benutzername");
			String passwort = (String) session.getAttribute("passwort");
	
			if(benutzer != null && passwort != null)
			{
			//MySQL benutzername prüfen, Id holen -> in Session speichern
			//boolean Variable für return je nach MYSQL Ergebnis
			
				//Verknüpfung benutzername und passwort aus mitarbeiter und aus kunde 			
				ResultSet rs = stmt.executeQuery("SELECT loginname, passwort, identity, id_benutzer FROM benutzer WHERE benutzer.loginname = '"+benutzer+"' AND benutzer.passwort = '"+passwort+"'");
```

diesmal wirft mir die mysql frage den nullpointer... was ich nid ganz begreife weil alle 3 verwendeten variablen vorher in ner if != null abgefangen werden...


----------



## PhantomXXL (19. Aug 2005)

wieder mal hervorkram:

aaalso das problem besteht immer noch nur diesmal ist es mysql das rummuckt. sobald der server einige stunden rennt liefert die stmt=mysqlconnection.getstatement() immer null (wird vor der funktion aufgerufen). dh fehlermeldung is zwar ausgemerzt aber man kann nicht mehr einloggen und gar nix mehr, weil einfach mysql nicht mehr geht. einzige abhilfe bisher ist es den tomcat neu zu starten.


----------



## PhantomXXL (13. Sep 2005)

```
Class.forName("com.mysql.jdbc.Driver").newInstance();	
			String dburl = "jdbc:mysql://" + Server + "/" + DB + "?user=" + User + "&password=" + Pass+"&autoReconnect=true";
			con = DriverManager.getConnection(dburl, "", "");
```

hab jetzt im internet gesucht und da steht was von diesem autoreconnect=treu in den jdbc link zu schreiben, es scheint nun teilwesie zu funktionieren, aber eben nicht immer weis wer wo der fehler sein könnte?


----------



## PhantomXXL (19. Sep 2005)

keiner ne ahnung was sein könnte? *immer noch vor dem problem sitzt*

es ist immer noch das mysql das (manchmal) nach ca. 8h inaktivität immer null wird. einzige abhilfe scheint zu sein nen cron laufen zu lassen der alle 6h die db zwingt was zu tun, aber auch nicht die schönste lösung.


----------



## KSG9|sebastian (19. Sep 2005)

warum übergibst du auch ein ResultSet an die SessionVerwaltung. 
M.E. ist das Pfusch. Wenn dann holst du dir ne Instanz von ner Db-Verwaltung und rufst dort ne Methode auf "pruefeUser(user, pass)", aber das RS weiterzugeben ist unsauber.

Warum eigentlich ResultSet#getStatement ? Wie wär es mit ResultSet#createStatement() ?


----------



## PhantomXXL (19. Sep 2005)

mysql ist eine klasse die meien komplette verwaltung der db übernimmt, das problem am tomcat ist das die klasse global in jedem aufgerufenem servlet gilt, daher muss ich jedesmal das statement (nicht resultset) aus der Connection rausholen.


```
public synchronized Statement getStatement() {
	try {
		return con.createStatement();
	} catch (SQLException e) {
		return null;
	}
}
```

aber das ist heri nicht das problem, weil auch ganz ohne sessionverwaltung nach 8h inaktivität ohne (und manchmal auch mit) die mysql verbindung einfach abstirbt.


----------



## Bleiglanz (19. Sep 2005)

gibs auf die Connection in der Session zu halten

=> jede Session eine Connection, könnten sehr viel werden

wann wie und wo willst du jemals conn.close() aufrufen?


----------



## PhantomXXL (22. Sep 2005)

das wird beim servlet per init aufgerufen der verbindungsaufbau, dh eine connection je seite die so lange offen is wie der server rennt. nur wenn sich 8h lang nix tut macht er die connection sql seitig zu... laut diversen seiten im internet muss ich da autoreconnect=true machen, hab ich geht aber immer noch nicht wirklich.

in der session steht gar nix ausser ne id und ein verschlüsseltes passwort, die hat mit der sql verbindung gar nix zu tun


----------



## Gast (22. Sep 2005)

connection ist noch da ? 
sicher dass du kein timeout von mysql kreiegst ?
steht was in den log-dateien vom server ?
post mal bissl code von deiner mysql klasse und vom Servlet#init
gruß sebastian


----------



## PhantomXXL (22. Sep 2005)

Servlet Init:

```
public void init() {
		startserver=System.currentTimeMillis();
		runs=0;
		tplPath = getServletConfig().getInitParameter("FastTemplatePath");
		srvid =getServletConfig().getInitParameter("ServerID");
		
		if( !(getServletConfig().getInitParameter("MySQLload").equals("true"))) {
			mysqlload=false;
		} else {
			mysqlload=true;
			String host = getServletConfig().getInitParameter("MySQLhost");
			String db = getServletConfig().getInitParameter("MySQLdb");
			String usr = getServletConfig().getInitParameter("MySQLuser");
			String pw = getServletConfig().getInitParameter("MySQLpass");			
			mysqlerrorset=false;
			try {
				mysql = new MySQLDB(host,db,usr,pw);
			} catch (SQLException e) {
				mysqlerror=e;
				mysqlerrorset=true;
			}
		}				
	}
```

mysql konstruktor

```
public MySQLDB(String Server, String DB, String User, String Pass) throws SQLException {
		try {
			Class.forName("com.mysql.jdbc.Driver").newInstance();	
			String dburl = "jdbc:mysql://" + Server + "/" + DB + "?user=" + User + "&password=" + Pass+"&autoReconnect=true";
			con = DriverManager.getConnection(dburl, "", "");
			stmt = con.createStatement();			
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
```

zu den logs vom server muss ich zugeben kein plan wie ich da rankomme, das is ne linux sache und funktiert über enn webadmin (ich weis gerade mal wie ich tomcat starten/stopen/restarten kann)


----------

