`

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


引用
问题就是出在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带来的没有框架干扰的开发吧。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics