webForumDet fria alternativet

SQLException: Stängd sats

4 svar · 469 visningar · startad av Jaar

JaarMedlem sedan juli 2001434 inlägg
#1

Får ett fel i en av mina funktioner...

PreparedStatement pstmt = null;
ResultSet rs = null;

pstmt = conn.prepareStatement("select email, password, nr, namn,  from skt.kunder where email = ? order by password");

pstmt.setString(1, user.getLoginName());
rs = pstmt.executeQuery();

if (rs.next())
{
	if (user.getLoginPassword().equals(rs.getString("password")))
	{
		user.setName(rs.getString("namn"));

		user.setLoggedin(true);
	}
	else
	{
		user.setLoggedin(false);
		rs.close();
		pstmt.close();
		throw new BadPasswordException(
		"Not correct password for user "
			+ user.getLoginName());
	}
	log.debug("User " + user.getLoginName() + " [No. " + user.getNo() + "] logged in at " + (new java.util.Date()));
}
else
{
	user.setLoggedin(false);
	log.debug("User " + user.getLoginName() + " not found when tried to login.");
	rs.close();
	pstmt.close();
	throw new UserNotFoundException(
		"User " + user.getLoginName() + " not found");
}

rs.close();
pstmt.close();
return user.isLoggedin();
}

Skickar med en toppen av stacktracen också:

java.sql.SQLException: Stängd sats
		 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
		 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java)
		 at oracle.jdbc.driver.OracleStatement.get_column_index(OracleStatement.java)
		 at oracle.jdbc.driver.OracleResultSetImpl.findColumn(OracleResultSetImpl.java)
		 at oracle.jdbc.driver.OracleResultSet.getString(OracleResultSet.java)
		 at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:216)
		 at myPackage.DBInterface.loginUser(DBInterface.java:334)

Rad 334 i DBInterface är else-satsen till if(rs.next())

Någon som har en aning om vad det är som ställer till det?

phonkworksMedlem sedan juli 2001228 inlägg
#2

Händer det 100% av tiden?

Kan någon annan tråd ha hunnit stänga din Connection conn i någon annan metod?

Pröva att köra koden inom:

synchronized(conn) {
  ...
}

mvh
phonk

JaarMedlem sedan juli 2001434 inlägg
#3

Det händer nog inte alltid.

Kör connection pool, och det är väl troligen där som problemet uppstår. Men jag tycker att det borde ske när PreparedStatement skapas i så fall, om det har med connection att göra. Det är alltid på samma sida som problemet uppstår, och samma rad. Andra sidor har aldrig problemet.

Ska testa dit tips, men vad gör synchronized(conn) mer exakt?

phonkworksMedlem sedan juli 2001228 inlägg
#4

Man synkroniserar kodblocket med avseende på instansen conn vilket innebär att ingen annan tråd får tillåtelse att manipulera conn, tex stänga den, så länge det blocket exekveras.

Förmodligen kommer det innebära att det ramlar ut ett exception nån annanstans där där en tråd får vänta med att köra conn.close() och den sen redan är stängd, förmodligen i din pool.

Det kanske går att ge poolen tillåtelse att ha fler öppna Connections?

mvh
phonk

JaarMedlem sedan juli 2001434 inlägg
#5

Tack för din hjälp. Jag skulle uppdatera med det du föreslog då jag såg att datumet på filen på servern var lite mystiskt. Jag trodde jag hade dubbelkollat det, men det visade sig att felmeddelandet ledde till ett rs-anrop efter att rs objektet var stängt.

Tack för din hjälp, men det var min klantighet som hade varit framme, inget annat :D

127 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)