0 0

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

先来看我的线程


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


DAO 
2008年10月19日 21:00

3个答案 按时间排序 按投票排序

0 0

采纳的答案

估計conn不是独立的,可能你把conn.close(); 放到DataHandle 類以外操作可能handle方法就不會出現這個錯誤了,但是具體原因還是要知道conn是怎么生成的?

2008年10月20日 10:37
0 0

你的5个线程产生的代码段贴出来分析下。

2008年10月20日 11:59
0 0

建议把完整的代码贴出来!

如果真正是每个线程里面各有1套独立的 connection/statement,resultset,应该不会出现“resultset have been closed”问题。

2008年10月19日 21:35

相关推荐

    JDBC数据库操作工具类

    10. **线程安全**:如果工具类在多线程环境中使用,需要注意线程安全问题,避免多个线程共享同一个数据库连接。 通过使用这样的JDBC数据库操作工具类,开发者可以有效地避免重复代码,降低出错概率,提高代码质量和...

    sqlite数据库操作封装类

    总的来说,"sqlite数据库操作封装类"是一个强大的工具,可以帮助开发者更高效、更安全地操作SQLite数据库,无论是简单的数据存储还是复杂的业务逻辑,都能提供便利。通过合理的接口设计和内部实现,可以极大地提升...

    使用JAVA中的动态代理实现数据库连接池.rar_数据库连接池_连接池

    在Java编程中,数据库连接池是一种管理数据库连接的机制,它允许程序在多个请求之间复用已打开的数据库连接,而不是每次请求时都创建新的连接。这样可以显著提高应用程序的性能,减少系统资源的消耗,并提供更可靠的...

    DateBase_java_

    在本项目中,“DateBase_java_”显然指的是一个使用Java编程语言实现的数据库管理系统,用于存储学生的基础信息。下面将详细讲解与这个项目相关的Java和数据库管理系统的知识点。 1. **Java编程语言**:Java是一种...

    QureyRunner 类和自编译的TxQureyRunner类,笔记和源码

    此外,压缩包中还包含了一个名为"JdbcUtils笔记源码jar包"的文件,这可能是一个包含了JDBC连接池和数据库操作辅助工具的jar包。其中,JdbcUtils类通常会提供数据库连接的创建、关闭以及批处理等便捷方法,配合...

    FMDB ios sqlite开源库

    FMDB是iOS应用开发中广泛使用的SQLite数据库管理库,它为开发者提供了一个高效且易于使用的接口,以便在Objective-C或Swift项目中与SQLite数据库进行交互。这个开源库由Cocoa社区的知名开发者Mike Ash开发,并得到了...

    对jdbc的封装的总结

    此外,我们还可以实现一个结果集处理类,将ResultSet映射到自定义的Java对象,这通常通过ORM(Object-Relational Mapping)框架如MyBatis或Hibernate完成。这种方法使得数据操作更加面向对象,提高代码的可读性和可...

    oracle分别使用jdbc和hibernate的例子

    Hibernate是一个ORM(Object-Relational Mapping)框架,它简化了数据库操作,使开发者可以专注于业务逻辑,而不是底层SQL。 使用Hibernate操作Oracle数据库: 1. 添加Hibernate依赖:在项目中引入Hibernate的jar包...

    swing 学生管理系统

    Swing学生管理系统是一款基于Java开发的桌面应用...总结来说,"Swing学生管理系统"是一个综合运用了Java GUI编程、数据库操作、事件驱动编程等多个核心技能的项目,对于学习和实践Java桌面应用开发具有很高的参考价值。

    commons-dbutils-1.3

    Apache Commons DBUtils是Java开发中的一个实用工具库,专门用于简化数据库操作。它是一个轻量级的框架,基于Java JDBC API,旨在使数据库编程变得更加简单和健壮。这个"commons-dbutils-1.3"版本是该库的一个早期...

    嵌入式SQL默认分类

    - 在多线程环境下,某些数据库的嵌入式SQL库(如Microsoft SQL Server的ESQL/C)可能不是线程安全的,应避免在多线程中使用,或者限制在单一线程内使用。 - 宿主语言(Host Language)和SQL语句之间的信息交换依赖于...

    DBUtils工具包(Jar包及帮助文档)

    总的来说,Apache Commons DbUtils是一个非常实用的工具,对于任何需要进行数据库操作的Java应用来说,都是一个值得考虑的选项。其简洁的API和高效的资源管理机制,可以显著提高开发效率并降低出错的可能性。通过...

    Java-JDBC资料.rar

    Java JDBC(Java Database Connectivity)是Java语言中用来规范应用程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这份"Java-JDBC资料.rar"压缩包包含了关于Java数据库连接的重要知识...

    boost----mysql connector c++ for visual studio 2008

    Boost库是C++编程语言的一个开源库,它提供了大量的可重用库,涵盖了从并发、图形到算法等多个领域,极大地提升了C++的灵活性和效率。在本篇文章中,我们将深入探讨如何在Visual Studio 2008环境下利用Boost库与...

    mysql c++ 封装类

    MySQL C++ 封装类是将MySQL数据库的接口与C++编程语言相结合,提供一个更加友好、方便的接口供开发者使用。在Windows环境下,这样的封装类通常会编译成动态链接库(DLL),使得其他C++项目可以方便地调用其中的函数...

    mysql-connector-java-8.0.12.rar

    MySQL Connector/J是MySQL数据库管理系统与Java应用程序之间的桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够轻松地在他们的应用中连接到MySQL服务器,执行SQL查询,...

    JDBC 比较稳定的JDBC封装(mc)

    在"JDBC 比较稳定的JDBC封装(mc)"这个项目中,"mc"可能是指一种特定的、经过优化和稳定化的JDBC使用模式或者库,旨在简化数据库操作,提高代码的可读性和可维护性。 JDBC的主要组件包括以下几个方面: 1. **Driver...

    mybatis-3.4.6jar包和源码包

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    java 常用工具类

    这里我们将深入探讨Java中的一些常用工具类,包括文件操作、字符串处理、时间管理和数据库交互等方面。 1. 文件上传下载:Java的`java.io`和`java.nio`包提供了丰富的文件操作API。例如,`File`类用于文件和目录的...

    commons-beanutils-1.8.0.7z

    在数据库操作中,BeanUtils可以将数据库查询结果集(ResultSet)中的每一行映射为一个JavaBean对象,通过RowMapper接口实现。这使得数据处理更加直观,减少了手动映射的繁琐工作。 4. **注意事项** - **空指针...

Global site tag (gtag.js) - Google Analytics