锁定老帖子 主题:一个常见的JDBC封装导致的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (11) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-05-16
最后修改:2011-05-16
操作一次没问题,操作两次就报错 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. Debug调试,发现connection不能真正关掉,使用connection完后,调用close()方法,下次getConnection()时候 instance不为null public class ConnectionUtil { private final static String url="jdbc:mysql://localhost:3306/qq?useUnicode=true&characterEncoding=UTF-8"; private final static String username="root"; private final static String password="root"; private static Connection instance=null; private ConnectionUtil(){ if(instance==null){ try { Class.forName("org.gjt.mm.mysql.Driver"); instance=DriverManager.getConnection(url, username, password); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } } public static Connection getConnection(){ if(instance==null){ new ConnectionUtil(); } return instance; } public static void close(Connection con,PreparedStatement ps,ResultSet rs){ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ con=null; } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ ps=null; } } if(rs!=null){ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ rs=null; } } } public static void close(Connection con,PreparedStatement ps){ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ con=null; } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ ps=null; } } } public static void close(Connection con){ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ con=null; } } } } 结贴了。。。。有其他结贴方式吗? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-05-16
关闭对象的次序貌似有问题。。。
|
|
返回顶楼 | |
发表时间:2011-05-16
Reset 写道 关闭对象的次序貌似有问题。。。
次序换了,但问题依旧 |
|
返回顶楼 | |
发表时间:2011-05-16
最后修改:2011-05-16
你这是单例,下次调用connection的时候当然不为空
|
|
返回顶楼 | |
发表时间:2011-05-16
jinyao 写道 你这是单例,下次调用connection的时候当然不为空
是单例,但是调用关闭方法,把instance关闭了的,就是单例里面instance为null了,那么它会再次new一次 |
|
返回顶楼 | |
发表时间:2011-05-16
你是把connection关闭了 而不是置空
|
|
返回顶楼 | |
发表时间:2011-05-16
jinyao 写道 你是把connection关闭了 而不是置空
finally{ con=null; } 最后有句这个代码 |
|
返回顶楼 | |
发表时间:2011-05-16
代码真够混乱的。 本来不想回了,算了,还是说一下吧。 悲剧了 写道 public class ConnectionUtil { private static Connection instance=null; } 这儿:instance是ConnectionUtil 类的静态变量。 悲剧了 写道 public static void close(Connection con){ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ con=null; } } } } 这儿:close()方法中,置空的con=null,是方法参数。ConnectionUtil.instance 并没有受到影响。 |
|
返回顶楼 | |
发表时间:2011-05-16
最后修改:2011-05-16
兄弟直接用spring jdbctemplate吧
public class ConnectionUtil { private final static String url="jdbc:mysql://localhost:3306/qq?useUnicode=true&characterEncoding=UTF-8"; private final static String username="root"; private final static String password="root"; public static Connection getConnection(){ try { Class.forName("org.gjt.mm.mysql.Driver"); return DriverManager.getConnection(url, username, password); } catch (Exception e) { throw new IllegalStatusException(e); } } public static void close(Connection con,PreparedStatement ps,ResultSet rs){ if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(ps!=null){ try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } close(con); } public static void close(Connection con,PreparedStatement ps){ close(con, ps, null); } public static void close(Connection con){ if(con!=null){ try { con.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ con=null; } } } } |
|
返回顶楼 | |
发表时间:2011-05-16
再说点其他的: 悲剧了 写道 public static Connection getConnection(){ if(instance==null){ new ConnectionUtil(); } return instance; } 按上下文的意思,应该是: public static Connection getConnection(){ if(instance==null){ instance = DriverManager.getConnection(url, username, password); } return instance; } |
|
返回顶楼 | |