当前位置: 代码迷 >> J2SE >> 关于JDBC中No operations allowed after connection closed的有关问题
  详细解决方案

关于JDBC中No operations allowed after connection closed的有关问题

热度:615   发布时间:2016-04-24 02:11:09.0
关于JDBC中No operations allowed after connection closed的问题

Java code
public static Operater check(String name, String password) {        Operater operater=new Operater();//操作员信息对象        String sql = "select *  from tb_operator where name='" + name                + "' and password='" + password + "'and admin=1";//查询字符串        ResultSet rs = Dao.executeQuery(sql);//执行查询        try {            while (rs.next()) {//如果查询到了记录                operater.setId(rs.getString("id"));//设置操作员编号                operater.setName(rs.getString("name"));//设置操作员用户名                operater.setGrade(rs.getString("admin"));//设置操作员等级                operater.setPassword(rs.getString("password"));//设置管理员密码            }        } catch (Exception e) {            e.printStackTrace();        }        Dao.close();    //关闭连接对象        return operater;//返回操作员信息对象    }


第一次调用此方法没问题 可第二次就出现下面的问题

com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException
No operations allowed after connection closed

这个问题怎么解决啊 只有把Dao.close();这个关闭Connection的方法去掉,可是这样好像也不对啊?
各位有没有碰到过类似的问题,有好的解决办法?

------解决方案--------------------
原因很简单。在对数据库操作结束后关闭连接是正确的做法,没什么大问题。至于出现:No operations allowed after connection closed。这样的问题原因只有一个,你这里和数据库的连接Connection是一个Static的,程序共享这一个Connection。所以第一次对数据库操作没问题,当把Connection关闭后,第二次还想操作数据库时Connection肯定不存在了。
------解决方案--------------------
try this:

if(conn==null) new Dao();
===>>>>>
if(conn == null || conn.isClosed()) new Dao();

=================================================
题外话

楼主的DAO类写得不怎么合理,其实DAO模式不是提供静态方法,而是使用实例方法

dao 中的 Connection conn 是静态的。楼主这样做如果是开发 AWT/Swing 类型的系统可能问题不大,但是如果是写jsp/servlet 这类网站这种多线程系统,一定会出问题。
  相关解决方案