org.xx. with address: "com.mysql.jdbc.Statement@a2f8" is closed.

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();
}



}

}


[quote]问题就是出在private UserDao userDao=new UserDao();上,这里的UserDao永远都是这一个该死的实例,每次掉用这个方法的时候,它都只认这个对象,因为第一次执行成功之后连接已经被关了,所以第2次掉这个方法的时候,怎么掉也没用,连接总是关的。[/quote]

改成这样:

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();
}



}
}


[quote]把UserDao userDao=new UserDao();实例化移到方法体内,每次NEW的对象都不在是同一个,这样一来,自然不会出现以上那种幼稚的错误了。[/quote]

[quote]OK,异常解决了,我继续体验JDBC+SERVLET/JSP带来的没有框架干扰的开发吧。[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值