# ResultSet aus Session geladen, aber kein Zugriff möglich



## BataL (23. Sep 2004)

Hallo,

folgendes Problem.

Ich lade ein RS aus einer session, und will dann daraus Daten ziehen. Die betreffenden Codezeilen
sind folgene.

```
<%
if(session.getAttribute("user") != null) {
	ResultSet user = (ResultSet)session.getAttribute("user");
	user.first();
%>
	Hello <%=user.getString("u_name")%>
```

Und zwar ist der Fehler den ich bekomme "Operation not allowed after result set is closed"
(Den kompletten error hab ich mal ganz unten gepostet)

Mir ist auch klar, dass dieser Fehler daher kommt, dass ich meine DB Verbindung geschlossen habe.
Aber was ich nicht verstehe ist weswegen das eine rolle spielt, wo ich das RS doch aus dem session objekt lade.

Ausserdem arbeite ich mit einem ConnectionPool (proxool). Der funktioniert wunderbar, aber wenn ich die DB
Verbindung nicht schliesse dann kann sie dem pool ja nicht mehr zur verfügung gestellt werden.

Ich bräuchte wirklich eure Hilfe, weil ich gar nicht weiß wo ich noch ansetzen soll. Evtl. schliesse ich die DBCon 
an einer falschen Stelle? Hier einfach mal der Code der die Verbindung aufbaut:


```
package org.batal.jblog.db;

import java.sql.*;

import org.logicalcobwebs.proxool.ProxoolException;
import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;

public class DatabaseConnect {
	
	protected Connection conn;
		
	public DatabaseConnect()
	{
		try {
			JAXPConfigurator.configure("c:/Programme/Apache Software Foundation/Tomcat 
                                    5.0/webapps/jblog/WEB-INF/web.xml", false);
		} catch (ProxoolException e) {
			e.printStackTrace();
		}
	}
	
	public void connect()
	{
		try {
			Class.forName("org.logicalcobwebs.proxool.ProxoolDriver").newInstance();
			conn = DriverManager.getConnection("proxool.jblog");
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
}
```


```
package org.batal.jblog.db;

import java.sql.*;

public class DatabaseActions extends DatabaseConnect {
	
	public DatabaseActions() 
	{
		super();
		connect();
	}
	
	public void close()
	{
		try {
			conn.close();
		} catch(SQLException e) {
			//
		}
	}
	
	public int checkUser( String user, String password ) throws SQLException {
		PreparedStatement ps = 
			conn.prepareStatement("SELECT * FROM users WHERE u_name='"+user+"' AND u_password='"+password+"'",
					ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
		ResultSet result = ps.executeQuery();
		result.beforeFirst();
		while( result.next() ) {
			return result.getInt("u_id");
		}
		return 0;
	}
	
	public ResultSet getUserByID( int id ) throws SQLException {
		try {
			PreparedStatement ps = 
				conn.prepareStatement("SELECT * FROM users WHERE `u_id`='"+id+"'",
					ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			ResultSet result = ps.executeQuery();
			return result;
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
		return null;
	}
	
	public ResultSet getPosts() throws SQLException {
		try {
			PreparedStatement ps = 
				conn.prepareStatement("SELECT * FROM articles ORDER BY a_date DESC",
					ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			ResultSet result = ps.executeQuery();
			return result;
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
		return null;
	}
	
	public ResultSet getSections() {
		try {
			PreparedStatement ps = 
				conn.prepareStatement("SELECT * FROM sections ORDER BY s_order ASC",
					ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			ResultSet result = ps.executeQuery();
			return result;
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
		return null;
	}
	
	public ResultSet getActionByName(String name) {
		try {
			PreparedStatement ps = 
				conn.prepareStatement("SELECT * FROM sections WHERE 
                                             s_action='"+name+"' ORDER BY s_order ASC",
					ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
			ResultSet result = ps.executeQuery();
			return result;
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
		return null;
	}
}
```




```
23.09.2004 09:21:35 org.apache.catalina.core.StandardWrapperValve invoke
SCHWERWIEGEND: Servlet.service() for servlet jsp threw exception
java.sql.SQLException: Operation not allowed after ResultSet closed
	at com.mysql.jdbc.ResultSet.checkClosed(ResultSet.java:3600)
	at com.mysql.jdbc.ResultSet.first(ResultSet.java:2340)
	at com.mysql.jdbc.UpdatableResultSet.first(UpdatableResultSet.java:413)
	at org.apache.jsp.login_jsp._jspService(org.apache.jsp.login_jsp:50)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:302)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:246)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:682)
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:581)
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:501)
	at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:966)
	at org.apache.jsp.index_jsp._jspService(org.apache.jsp.index_jsp:82)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:325)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:302)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:246)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:311)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:106)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection
                 (Http11Protocol.java:705)
	at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:576)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Unknown Source)
```


----------



## DP (23. Sep 2004)

wenn du den resultset in die jsp schiebst, ist der imho schon zu.

da musste den rs in deinem code durchlaufen, auslesen und den container dann in deine jsp schieben...


----------



## Bleiglanz (23. Sep 2004)

Du kannst das Resultset nicht in eine Session legen (eigentlich keine chance) => wann willst du rs.close() machen? und wann connection.close()?


Bei einem Request wird ein Thread gestartet der nach dem Abschicken der jsp beendet wird, dabei endet der "scope" der Connection [und an dieser hängt das resultset]


----------



## akira (23. Sep 2004)

Kurzum, Du must Dir ein Transfer-Objekt "User" schreiben, in das Du die Daten aus dem ResultSet überträgst. Dieses Objekt hängst Du dann in die Session. Das ResultSet ist selbst in dem Sinne kein Datencontainer, sondern verliert mit dem Schließen des Statements oder der Connection seine Gültigkeit, es ist mehr ein Cursor auf die aktuelle DB-Zeile.

Ich habe in Deinem Code gesehen, daß Du *eine* permanente Connection verwendest, was eher unüblich/problematisch ist. Schließe die Connection nach jedem Statement besser wieder und fordere sie bei einem neuen Statement wieder an, sonst bekommst Du sicher irgendwann ein Timeout und die Connection ist weg.

_edit: sorry, Du benutzt ja pro Action eine neue Connection, die Du allerdings nie schließt (?), zumindest nicht im gepostetn Code _


----------



## Guest (23. Sep 2004)

...oder CachedRowSet nehmen.


----------



## DP (23. Sep 2004)

wieso willste denn die db-results im view auseinandernehmen?


----------



## BataL (24. Sep 2004)

richtig, nicht im geposteten code. ich hatte ja probleme, weil dann mein ers in der session immer weg war. das hab ich nur deswegen weggemacht, soll aber nicht so bleiben.
ich muss es ja schliessen wegen meinem pool.

im resultset steht jeweils eine ganze row. danach wird halt auf authorisationsebene usw überprüft. dazu brauch ich die einzelnen daten eben.

also ich hab jetzt ne bean dazwischen geschaltet, die daten aufnimmt. funktioniert soweit. 

danke für die antworten. 

falls noch jemand ne gute idee hat zum datenmanagement würde ich mich freuen wenn er hier kurz was drüber schreibt... (ide bean ist echt langsam )


----------

