Object has been closed.

问题描述

Connection conn= DbUtil.getConnection();Statement stmt=null;System.out.println(conn+"&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");stmt=conn.createStatement();System.out.println(conn+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");ResultSet rs = stmt.executeQuery("select * from exam order by exam_id");显示为:com.microsoft.jdbc.sqlserver.SQLServerConnection@161dfb5&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Object has been closed.at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)at com.microsoft.jdbc.base.BaseConnection.validateClosedState(Unknown Source)at com.microsoft.jdbc.base.BaseConnection.createStatement(Unknown Source)at com.microsoft.jdbc.base.BaseConnection.createStatement(Unknown Source)at com.sdjzglxy.jwMis.dao.ExamDaoImpl.queryExams(ExamDaoImpl.java:87)at com.sdjzglxy.jwMis.jwMisFrame.JwMisFrame.createQueryPanel(JwMisFrame.java:421)at com.sdjzglxy.jwMis.jwMisFrame.JwMisFrame.<init>(JwMisFrame.java:96)at com.sdjzglxy.jwMis.jwMisFrame.JwMisFrame.main(JwMisFrame.java:719)我觉得问题是这段代码:stmt=conn.createStatement();因为我打印了conn它并不为null,但是执行stmt=conn.createStatement();却提示数据库已经关闭。我想问一下,究竟该如何解决。 问题补充:hudingchen 写道

解决方案

引用final public static void colse(ResultSet rs, Statement stmt, Connection conn)throws Exception {if (conn != null || !conn.isClosed()) { conn.close(); conn = null; } else { if (stmt != null) { stmt.close(); stmt = null; } else { if (rs != null) { rs.close(); rs = null; } }}}}我的DbUtil是这样写的,帮忙看一下是否正确!谢谢 这样写:if (rs != null){ rs.close(); rs = null;}if (stmt != null){ stmt.close(); stmt = null;}if (conn != null){ conn.close(); conn = null;}
解决方案二:
关闭的顺序不正确,应该先关闭resultset,然后是statement,最好才是connection,呵呵。
解决方案三:
final public static void colse(ResultSet rs, Statement stmt, Connection conn)throws Exception {if (rs != null) {rs.close();}if (stmt != null) {stmt.close();}if (conn != null || !conn.isClosed()) {conn.close();}}
解决方案四:
楼上的说的对。关闭顺序,必须严格按照rset, stmt, conn来。
解决方案五:
应该与conn,stmt,rs关闭顺序有关,应该先rs.close();然后stmt.close();最后conn.close();
解决方案六:
类DbUtil中的conn是static的,其他程序会修改的啊,你把close改成下面看看if (conn != null || !conn.isClosed()) {conn.close();conn = null;} else {if (stmt != null) {stmt.close();stmt = null;} else {if (rs != null) {rs.close();rs = null;}}}

时间: 2024-11-02 23:15:55

Object has been closed.的相关文章

一线架构师带你玩性能优化

1.什么是系统优化 系统优化一个方面是系统化的对IT系统或交易链上的每个环节进行分析并优化,另一个是对单一系统进行瓶颈点分析和调优.但优化的目标大致相同,无非是提高系统的响应速度.吞吐量.降低各层耦合,以应对灵活对边的市场. 系统优化的3个层次:IT架构治理层.系统层.基础设施层. IT系统治理层:优化的目的不只是性能优化,还会有为适应业务架构变化而带来的应用架构优化(如:应用分层.服务治理等). 系统层:优化的目的包括业务流程优化.数据流程优化(如:提高系统负载.减少系统开销等) 基础设施层:

基于Android如何实现将数据库保存到SD卡_Android

有时候为了需要,会将数据库保存到外部存储或者SD卡中(对于这种情况可以通过加密数据来避免数据被破解),比如一个应用支持多个数据,每个数据都需要有一个对应的数据库,并且数据库中的信息量特别大时,这显然更应该将数据库保存在外部存储或者SD卡中,因为RAM的大小是有限的:其次在写某些测试程序时将数据库保存在SD卡更方便查看数据库中的内容. Android通过SQLiteOpenHelper创建数据库时默认是将数据库保存在'/data/data/应用程序名/databases'目录下的,只需要在继承SQ

Mysql Java驱动代码阅读笔记及JDBC规范笔记

一前言: 以前刚开始用java连接mysql时,都是连猜带蒙的.比如: 一个Statement,Connection何时关闭? Connection能不能先于Statement关闭? ResultSet是怎样存放数据的?怎样才能高效操纵ResultSet? PrepareStatement到底是怎样回事? 连接池是怎样工作的? 二.从JDBC driver代码分析: 在性能要求高的地方,应当使用ResultSet.get**(int)系列函数 如ResultSet.getBytes(String

sqlite-getReadableDatabase()不能在ui线程进行?

问题描述 getReadableDatabase()不能在ui线程进行? 以前我一贯的写法是getReadableDatabase()和getWritableDatabase() 都是在ui线程进行的,而且在android4.0以上版本都没有任何问题,最近换了个android2.2的设备测试,发现就报错了,异常是SQLiteException 并提示database is locked这些信息,检查我对数据库的操作只不过是写完数据后读数据,应该不存在数据库被锁的问题. 思前想后,在SQLiteO

C# 批量插入表SQLSERVER SqlBulkCopy往数据库中批量插入数据

#region 帮助实例:SQL 批量插入数据 多种方法 /// <summary> /// SqlBulkCopy往数据库中批量插入数据 /// </summary> /// <param name="sourceDataTable">数据源表</param> /// <param name="targetTableName">服务器上目标表</param> /// <param nam

think in java interview-高级开发人员面试宝典(五)

这次开始我们来点洋文吧. 有些基础,大家可能用中文知道如何表示,但是面试官如果让你用全英语表达你就不知道如何去说了,那么下面我们将给出对于一些常用的JAVA基础知识的英语问答以及相关的答案. 大家可以看一下如何用英语去回答这些基础的问题,找一下感觉. Overriding & Overloading Overriding - same method names with same arguments and same return types associated in a class and

js for in 输出window对象所有属性

js for in 输出window对象所有属性 <html> <head>    <title>window object properties array</title> </head> <body> <script> for (var i in window) {   document.write ("window property(" + i +  "): " +     

activiti中的bug列表

分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_30739519) Bug [ACT-1968] - Custom Database schema on PostgreSQL not working [ACT-4113] - REST Task API Not working: /service/runtime/tasks?assigneeLike=XX and service/runtime/tasks?ownerLike=YY

基于Android如何实现将数据库保存到SD卡

有时候为了需要,会将数据库保存到外部存储或者SD卡中(对于这种情况可以通过加密数据来避免数据被破解),比如一个应用支持多个数据,每个数据都需要有一个对应的数据库,并且数据库中的信息量特别大时,这显然更应该将数据库保存在外部存储或者SD卡中,因为RAM的大小是有限的:其次在写某些测试程序时将数据库保存在SD卡更方便查看数据库中的内容. Android通过SQLiteOpenHelper创建数据库时默认是将数据库保存在'/data/data/应用程序名/databases'目录下的,只需要在继承SQ