多线程中操作数据库,resultset还未结束当前操作,己被另一个线程提前关闭而出错

问题描述

先来看我的线程 private DataHandle dh = new DataHandle(); public synchronized void runTask() { try { dh.handle(pbean.getStartNo(), pbean.getEndNo()); } catch (Exception e) { e.printStackTrace(); // TaskManagerBean.returnItem(); } 这个是我的线程,里面用到一个叫DataHandle的类,现在来看这个DataHandle的类 public synchronized void handle(String start, String end) { Statement stmt = null; ResultSet rs = null; StringBuffer sb = new StringBuffer(); try { if (conn != null) { sb.append("select tid,tname,description,dbvalue,xmlvalue"); sb.append(" from exporttable limit " + start + "," + end); System.out.println("sql===" + sb.toString()); stmt = conn.createStatement(); rs = stmt.executeQuery(sb.toString()); while (rs.next()) { db = new DataBean(); db.setTname(StringUtil.replaceNull(rs .getString("tname"))); db.setDescription(StringUtil.replaceNull(rs .getString("description"))); db.setDbValue(StringUtil.replaceNull(rs .getString("dbvalue"))); db.setXmlValue(StringUtil.replaceNull(rs .getString("xmlvalue"))); /* resultList.add(db); */ // dealing(db); } /* return resultList; */ } } catch (Exception e) { e.printStackTrace(); } finally { try { rs.close(); rs = null; } catch (Exception e) { } try { stmt.close(); stmt = null; } catch (Exception e) { } try { conn.close(); conn = null; } catch (Exception e) { } } } 这个类里有一个handle方法 这个线程是这样运行的,5个线程 第一个线程取0-100条记录 第二个线程取100-200条记录 第三个线程取200-300条记录 . . . 依此类推, 现在的问题时,程序在运行时经常出现:resultset have been closed这样的问题 经分析,是因为5个线程中,每个线程都有操作DataHandle的类,那么内存中就有5个DataHandle类,每个类中由于都进行resultset的打开,因此在运行时, 会发生一个线程中的ResultSet还在被操作时,已经被另一个线程中的ResultSet关闭的情况 我试过了 在DataHandle中Synchronized(rs),synchronized(stmt),甚至我的方法大家都看到了,都是synchronized的,为什么还会发生这样的事,大家有没有好的解决方法 多说一句,每个DataHandle中打开一个connection即每个线程都开一个单独的CONNECTION的,然后操作完100条数据后关闭,因此始终是存在5个线程,5个connection,5个resultset. 还是我的设计上有问题,我的设计就想是 多个线程,同时读数据库,只不过是每个线程读不同的数据块,就像我前面提到过的一样,0-100,100-200这样读的. 问题补充:我的CONNECTION是在JBOSS里设了一个数据库连接池,然后我这个是应用程序在应用程序里我是如此得到的:public class JndiContext {private static JndiContext m_instance = null;public static DataSource ds = null;private JndiContext() {}synchronized public static JndiContext getInstance() {if (m_instance == null) {try{Properties props = new Properties();props.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");props.setProperty("java.naming.provider.url", "localhost:9099");Context ctx = new InitialContext(props);ds = (DataSource) ctx.lookup("MySqlDS");}catch(Exception e){ds = null;e.printStackTrace();}m_instance = new JndiContext();}return m_instance;}}然后我有一个DataConnection类类里是这样得到CONNECTION的Connection getDataConnection(){Connection conn = null;try{conn = JndiContext.getInstance().ds.getConnection();return conn;}catch(Exception e){e.printStackTrace();return null;}}

解决方案

估計conn不是独立的,可能你把conn.close(); 放到DataHandle 類以外操作可能handle方法就不會出現這個錯誤了,但是具體原因還是要知道conn是怎么生成的?
解决方案二:
你的5个线程产生的代码段贴出来分析下。
解决方案三:
建议把完整的代码贴出来!如果真正是每个线程里面各有1套独立的 connection/statement,resultset,应该不会出现“resultset have been closed”问题。

时间: 2024-08-26 16:17:27

多线程中操作数据库,resultset还未结束当前操作,己被另一个线程提前关闭而出错的相关文章

ASP操作数据库的类,让数据操作变得简单

对于ASP的使用者来说,在数据库操作上越简单,就有更多的时间去考虑逻辑上和应用上的代码,效率也会更高.今天俺在这里给大家提供一种数据库操作的思路,这些代码是俺在长期的ASP应用中不断完成和修正的,也已经用它完成了很多项目了,应该说直接拿去用是没有问题的.当然本人能力也有限,希望大家一起来讨论. 说明:此帖代码均是VBScript版本.另外最好你对手写ASP已经有一定的基础. 先简单介绍一下俺这个类的一些特点: 1.可同时操作多个不同类型的数据库.2.完全不用考虑数据类型的差别,再也不用想字符型字

还未结束就能把自身删除的程序

下面的代码由Gary Nebbett写就.Gary Nebbett乃是WINDOWS NT/2000 NATIVE API REFERENCE的作者.乃NT系统一等一的高手.下面就分析一些他的这段代码. 这段代码在PROCESS没有结束前就将启动PROCESS的EXE文件删除了. int main(int argc, char *argv[]) { HMODULE module = GetModuleHandle(0); CHAR buf[MAX_PATH]; GetModuleFileName

新东方与做空机构浑水公司(MuddyWatersResearch)之间的博弈还未结束

近日,美国律师事务所GlancyBinkow GoldbergLLP又宣布,已经代表于2009年7月21日至2012年7月17日之间购入新东方美国存托凭证的所有个人或实体发起集体诉讼.目前,起诉书已经向加州中部地区法院递交. 新东方遭遇"集体诉讼" 这家律师事务所指控称,新东方自2009年7月至今,发布了虚假或有误导性的消息,公司及部分高管涉嫌违反美国联邦证券法的规定. 记者注意到,事实上,这家律师事务所对新东方的指控与浑水公司此前的做空报告相差无二,具体来说包括:从事新东方业务运作的

贴篇文章,BETA2中ACCESS操作数据库

access|数据|数据库 朋友们好,回家已经有10天了,总算是开始学.NET了,直接的感觉就是MS的帮助太差了,好多错误在上面,害的我走了好多弯路,结果好多东西还没有完全搞好,简直了!由于BETA2和BETA1比较,变化太大了,而现在无论是书还是网络上的资料基本都还停留在BETA1上,是朋友们在学习的时候遇到好多问题还无处可查,这里我把我的学习过程中遇到的一些问题和体会拿出来与大家分享,希望能给也在学习过程中的朋友有些帮助! 我估计,朋友们在学习.NET的过程中,遇到的最多的问题就是在和数据库

c++-VS操作word,往文档中写入如几万条的数据后,保存然后释放资源关闭进程中,会出现进程未退出

问题描述 VS操作word,往文档中写入如几万条的数据后,保存然后释放资源关闭进程中,会出现进程未退出 VS操作word,往文档中写入如几万条的数据后,保存word,然后释放资源关闭winword.exe过程中,会出现winWord.exe未退出(数据量不大时操作是正常的),请教下,这有可能是什么原因,可否有方法解决?下列代码:void CWord::CloseApp(){ m_wdTable.ReleaseDispatch(); m_wdRange.ReleaseDispatch(); m_w

深入探讨Java多线程中的volatile变量_java

volatile 变量提供了线程的可见性,并不能保证线程安全性和原子性. 什么是线程的可见性: 锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据.可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的 -- 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前

MFC读取浮点数组关于遇到脏数据的问题,多线程中为什么会出现脏数据

问题描述 MFC读取浮点数组关于遇到脏数据的问题,多线程中为什么会出现脏数据 MFC读取浮点数组关于遇到脏数据的问题,多线程中为什么会出现脏数据?我是分块读取的难道还会出现数据的冲突么?多线程并发不会写怎么办? 解决方案 所谓脏数据,就是一个线程修改了这个数据的副本,另一个线程持有的副本并没有更新,还是原来的数据,所以叫脏数据.

PHP的Yii框架中使用数据库的配置和SQL操作实例教程_php实例

数据库访问 (DAO)Yii 包含了一个建立在 PHP PDO 之上的数据访问层 (DAO). DAO为不同的数据库提供了一套统一的API. 其中ActiveRecord 提供了数据库与模型(MVC 中的 M,Model) 的交互,QueryBuilder 用于创建动态的查询语句. DAO提供了简单高效的SQL查询,可以用在与数据库交互的各个地方. Yii 默认支持以下数据库 (DBMS): MySQL MariaDB SQLite PostgreSQL CUBRID: 版本 >= 9.3 .

使ASP.NET中的数据库操作变得简单

asp.net|数据|数据库 作者:Willmove 主页:http://www.amuhouse.com E-mail: willmove@gmail.com 声明:系作者原创作品,转载请注明出处. ASP.NET中一般都是使用SQL Server作为后台数据库.一般的ASP.NET数据库操作示例程序都是使用单独的数据访问,就是说每个页面都写连接到数据库,存取数据,关闭数据库的代码.这种方式带来了一些弊端,一个就是如果你的数据库改变了,你必须一个页面一个页面的去更改数据库连接代码. 第二个弊端