Session NullPointerException

Status
Nicht offen für weitere Antworten.

PhantomXXL

Bekanntes Mitglied
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.

Code:
		session.setMaxInactiveInterval(3600);
 

PhantomXXL

Bekanntes Mitglied
Code:
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

Aktives Mitglied
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

Gesperrter Benutzer
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

Bekanntes Mitglied
naja die session wird nur für die bearbeitung dieser einen seite gespeichert. sobald eine seite geladen wird macht er
Code:
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

Gesperrter Benutzer
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

Bekanntes Mitglied
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

Bekanntes Mitglied
Code:
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

Bekanntes Mitglied
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

Bekanntes Mitglied
Code:
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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.

Code:
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

Gesperrter Benutzer
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

Bekanntes Mitglied
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
 
G

Gast

Gast
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

Bekanntes Mitglied
Servlet Init:
Code:
	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
Code:
	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)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A (EJB)Session abhängige Parameter in POJO lesen Allgemeines EE 3
O JSF / Primefaces Session handling Allgemeines EE 1
I Session löschen in Bean (Session Beans) Allgemeines EE 1
J Hello World mit Stateless Session Bean - Was mache ich falsch? Allgemeines EE 2
H Shared Session in Webmodulen Allgemeines EE 2
J Unterschied zwischen HttpSession und Stateful Session Bean Allgemeines EE 3
R Wie eine stateful session bean erneut "aufgreifen" Allgemeines EE 22
P Unterschied Session Scope / Stateful Session Bean Allgemeines EE 6
F Session zerstören Allgemeines EE 12
A Im PhaseListener auf Stateful Session Bean zugreifen Allgemeines EE 6
G Session Allgemeines EE 6
E Session Problem Allgemeines EE 9
G Session neu!? Allgemeines EE 7
M Fehler bei Javamail Session mit Glassfish 3 Allgemeines EE 3
Java.getSkill() verbindung / connection in session speichern Allgemeines EE 4
D Frage zum Statefull Session Beans Lebenszyklus Allgemeines EE 3
MQue Session - Cookie Allgemeines EE 27
MQue Session Exception Allgemeines EE 5
M j_security_check Login und Session-ID Allgemeines EE 2
S Session in eine andere Anwendung übergeben Allgemeines EE 2
F Session abgelaufen und direkter Aufruf Allgemeines EE 10
Y myFaces und Hibernate Session Handling Allgemeines EE 7
S tomcat session timeout - und was danach? Allgemeines EE 1
Q Form Based Authentication - Session Attribute ? Allgemeines EE 2
A Session Bean mit Local-Interface nutzen Allgemeines EE 3
G Session Cookies Allgemeines EE 2
Q Session Tracking - Wie macht mans richtig! Allgemeines EE 3
B Session Daten pro User merken Allgemeines EE 9
H [JSP JSF] Session Timeout und Redirekt zur Startseite Allgemeines EE 5
I Session-Attribute von Client zugänglich? Allgemeines EE 6
G session token Allgemeines EE 3
K tomcat: session-unabhängiges speichern Allgemeines EE 3
S Struts und Session Allgemeines EE 2
J Tomcat mit eigener Session-Implementierung Allgemeines EE 15
Y JSF - Session Handling Firefox Allgemeines EE 3
Y JSF - Session invalidate bei outpulink möglich? Allgemeines EE 4
R Session Tracking & Cookies Allgemeines EE 3
B Variablen ausserhalb der session ? Allgemeines EE 2
T Zugriff auf Session-Objekte in JSP Allgemeines EE 2
W Session tracking mit URL rewrite - Session weg! Allgemeines EE 4
G Neue Session bei der Verwendung von Frames Allgemeines EE 3
RaoulDuke EJB 3.0 - Exceptions aus Methoden einer Session Bean Allgemeines EE 2
T Session-Problem Allgemeines EE 2
Z Session aufräumen Allgemeines EE 2
G Session Problem Allgemeines EE 5
G JBoss - Session / Entity Allgemeines EE 8
S Bild in Session Allgemeines EE 2
F Session Bean -> Daten aus dem Servlet holen Allgemeines EE 11
P Struts Form Bean vs. Session Variable Allgemeines EE 6
A JSF - Daten in Session speichern Allgemeines EE 2
R Formulareingaben gezielt aus Session löschen Allgemeines EE 4
W Session nach Browserschließung erhalten im Tomcat Allgemeines EE 4
R Vernünftige Session-Verwaltung mit Struts Allgemeines EE 4
Q Tomcat/java-Session-Problem Allgemeines EE 9
L Zwei Browserfenster mit unterschiedlicher session - geht das Allgemeines EE 3
flashfactor Logging in einem Session-Bean Allgemeines EE 2
H JSP, Session und Java-Bean Allgemeines EE 4
P Session Problem Allgemeines EE 17
flashfactor Frage zu Session-Lebensdauer Allgemeines EE 3
J xdoclet session facade + value object Allgemeines EE 2
M Session Bean vers. Entity Bean Allgemeines EE 3
G ResultSet in Session speichern Allgemeines EE 4
P Session Attribute an Klasse übergeben Allgemeines EE 13
G Mit Session-IDs richtig umgehen Allgemeines EE 3
C Mail von einer Session Bean aus senden Allgemeines EE 2
H daten in session speichern Allgemeines EE 8
G list in session schreiben Allgemeines EE 4
P String-Array an session Variable übergeben Allgemeines EE 3
P Session Beans importieren Allgemeines EE 2
F Problem mit Session (Weitergabe an andere JSPs) Allgemeines EE 2
G json-b + jax-rs + getter mit Parameter = NullPointerException Allgemeines EE 10
J Asynchrones Servlet löst NullPointerException aus Allgemeines EE 5
J Netbeans + JavaEE. NullPointerException Allgemeines EE 3
D JSF, Primefaces - NullPointerException Allgemeines EE 7
C EntityManager wirft NullpointerException: JBoss-Hibernate Allgemeines EE 4
R NullPointerException Allgemeines EE 11

Ähnliche Java Themen

Neue Themen


Oben