java.sql.SQLException: org.apache.tomcat.dbcp.dbcp.DelegatingStatement with address: "com.mysql.jdbc.Statement@a2f8" is closed.
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.checkOpen(DelegatingStatement.java:137)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:206)
这个异常绝对要人郁闷。大概意思是,操作的时候,因为连接已经被关闭了,所以失败出异常。我在网上找烂的答案,结果还是没有。我细细的找代码,没有发现哪里提前关了连接。
终于,1个多小时过去了,找到了错误的原因,是代码的问题。一开始我写成这样:
public class UserService {
private UserDao userDao=new UserDao();
public void saveUserInformationByRegister(String name,String password){
try {
String sql="INSERT INTO user(LoginName,PassWord) VALUES"+"('"+name+"','"+password+"')";
userDao.init();//取得连接
userDao.startTransaction();//开启显示事务
userDao.initStatement();//创建stat语句
userDao.execute(sql);
userDao.commitTransaction();//事务完成
} catch (Exception e) {
userDao.RollBackTransaction();
e.printStackTrace();
}finally{
userDao.release();
}
}
}
引用
问题就是出在private UserDao userDao=new UserDao();上,这里的UserDao永远都是这一个该死的实例,每次掉用这个方法的时候,它都只认这个对象,因为第一次执行成功之后连接已经被关了,所以第2次掉这个方法的时候,怎么掉也没用,连接总是关的。
改成这样:
public class UserService {
public void saveUserInformationByRegister(String name,String password){
UserDao userDao=new UserDao();
try {
String sql="INSERT INTO user(LoginName,PassWord) VALUES"+"('"+name+"','"+password+"')";
userDao.init();//取得连接
userDao.startTransaction();//开启显示事务
userDao.initStatement();//创建stat语句
userDao.execute(sql);
userDao.commitTransaction();//事务完成
} catch (Exception e) {
userDao.RollBackTransaction();
e.printStackTrace();
}finally{
userDao.release();
}
}
}
引用
把UserDao userDao=new UserDao();实例化移到方法体内,每次NEW的对象都不在是同一个,这样一来,自然不会出现以上那种幼稚的错误了。
引用
OK,异常解决了,我继续体验JDBC+SERVLET/JSP带来的没有框架干扰的开发吧。