Click to See Complete Forum and Search --> : Can not change variable


prt20
08-28-2008, 11:09 AM
When a user logs out of my website i want to close the DB connection. But when they log back on the servlet needs to create the DB connection again. So i set the connection to null when the logout servlet is run. I have debugged it using breakpoints and can see that in the logout servlet the connection is set to null. But when it returns to the base servlet the connection is back again.

What is going on?????? :confused:


public class LogoutServlet extends BaseServlet {

public LogoutServlet(){

}


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(false);
session.invalidate();

try {
connection.close();
setConnection(null);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


RequestDispatcher rd = request.getRequestDispatcher("/loginAgain.jsp");
rd.forward(request,response);
}
}

public class BaseServlet extends HttpServlet {

public Connection connection;

public HttpServletRequest request;

public BaseServlet() {
connection = ConnectToDB.getConnection();
}


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doPost(request, response);
}


public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {


connection = ConnectToDB.getConnection();

// Create a session
HttpSession session = request.getSession(false);
System.out.println("Session: " + session);

// Set up the rd object
RequestDispatcher rd = request
.getRequestDispatcher("/loginAgain.jsp");

}

// reroute the user to the right page
rd.forward(request, response);

}


public void setConnection(Connection connection) {
this.connection = connection;
}


}


public class ConnectToDB {

/**
* The connection object
*/
public static Connection conn = null;


/**
* This is private constructor for the ConnectTODB class.
*/
private ConnectToDB() {

System.out.println("Constructor ConnectToDB");
try {

// Load the JDBC driver
String driverName = "com.mysql.jdbc.Driver"; // MySQL MM JDBC driver
Class.forName(driverName);

// Create a connection to the database

String serverName = ;
String mydatabase = "";
String url = "jdbc:mysql://" + serverName + "/" + mydatabase; // a JDBC url
String username = "";
String password = "";
conn = DriverManager.getConnection(url, username, password);

}

catch (ClassNotFoundException e) {
// Could not find the database driver
System.out.println("Could not find the database driver");
}

catch (SQLException e) {
// Could not connect to the database
System.out.print(e.getMessage());
System.out.println("Could not connect to the database");
}
}

/**
* The public method which sets up and sets the Connection object
*
* @return conn Connection object
*/
public static Connection getConnection() {

if (conn == null) {
new ConnectToDB();
}

return conn;

}

chazzy
08-28-2008, 12:32 PM
that's a very, very bad approach. don't forget, when you have multiple sessions, they all share the same instance of a servlet. servlets therefor shouldn't be dependent on instance variables, but you can pull them out of different scopes.

prt20
08-28-2008, 12:57 PM
i see, so what your saying is that if the connection to the DB is closed, then it will be for all users.

What do you recommend i should do??

chazzy
08-28-2008, 02:50 PM
create a new connection as needed, or use JNDI to get a reference to the connection.

prt20
08-28-2008, 03:24 PM
This seems to work. Is it better approach? Any guidance would be great :)

public static Connection getConnection() {

if (conn==null){
new ConnectToDB();
}

try {
System.out.println("this is whats happening:"+conn.isClosed());
if(conn.isClosed() == true){
new ConnectToDB();
}

} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return conn;
}

prt20
08-30-2008, 07:32 AM
Now the connection to the database works, but over night something happens , tomcat restarting maybe????, and the connection seems to drop and a new one isnt created. Can you see why? How long does a connection last until it isnt alive.

prt20
08-30-2008, 11:58 AM
Ok i understand whats going on a bit more now.

The mysql server gets restarted each evening, which i re-created on localhost by starting and stopping mysql service. And when the connection is requested, the getConnection() method does not create a new connection because the old one is still alive and is not closed.

But i tried creating a new connection each time by simply doing:


public static Connection getConnection() {

new ConnectToDB();

return conn;
}


And this throws an execption:

SQLException: Communications link failure

Last packet sent to the server was 28 ms ago.
30-Aug-2008 16:52:14 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet GetPasswordServlet threw exception
java.lang.NullPointerException
at com.sussex.gprd.web.servlets.GetPasswordServlet.doPost(GetPasswordServlet.java:55)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:399)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.sussex.gprd.web.servlets.BaseServlet.doPost(BaseServlet.java:106)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProt ocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
30-Aug-2008 16:52:14 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet BaseServlet threw exception
java.lang.NullPointerException
at com.sussex.gprd.web.servlets.GetPasswordServlet.doPost(GetPasswordServlet.java:55)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:399)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.sussex.gprd.web.servlets.BaseServlet.doPost(BaseServlet.java:106)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProt ocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
Constructor ConnectToDB
Session: org.apache.catalina.session.StandardSessionFacade@bbbd0e
loggedIn: true
SQLException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:


** BEGIN NESTED EXCEPTION **

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
MESSAGE: Communications link failure

Last packet sent to the server was 28 ms ago.

STACKTRACE:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 28 ms ago.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2985)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3414)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)
at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1383)
at com.sussex.gprd.web.servlets.GetPasswordServlet.getInfo(GetPasswordServlet.java:97)
at com.sussex.gprd.web.servlets.GetPasswordServlet.doPost(GetPasswordServlet.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:679)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:461)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:399)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
at com.sussex.gprd.web.servlets.BaseServlet.doPost(BaseServlet.java:106)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProt ocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
at java.lang.Thread.run(Unknown Source)
Caused by: java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.ja va:160)
at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2428)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882)
... 34 more


** END NESTED EXCEPTION **


30-Aug-2008 16:52:35 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet GetPasswordServlet threw exception
java.lang.NullPointerException
at com.sussex.gprd.web.servlets.GetPasswordServlet.doPost(GetPasswordServlet.java:55)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at

........


Any ideas?

chazzy
08-30-2008, 12:56 PM
http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html