先来看我的线程
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;
}
}
相关推荐
10. **线程安全**:如果工具类在多线程环境中使用,需要注意线程安全问题,避免多个线程共享同一个数据库连接。 通过使用这样的JDBC数据库操作工具类,开发者可以有效地避免重复代码,降低出错概率,提高代码质量和...
总的来说,"sqlite数据库操作封装类"是一个强大的工具,可以帮助开发者更高效、更安全地操作SQLite数据库,无论是简单的数据存储还是复杂的业务逻辑,都能提供便利。通过合理的接口设计和内部实现,可以极大地提升...
在Java编程中,数据库连接池是一种管理数据库连接的机制,它允许程序在多个请求之间复用已打开的数据库连接,而不是每次请求时都创建新的连接。这样可以显著提高应用程序的性能,减少系统资源的消耗,并提供更可靠的...
在本项目中,“DateBase_java_”显然指的是一个使用Java编程语言实现的数据库管理系统,用于存储学生的基础信息。下面将详细讲解与这个项目相关的Java和数据库管理系统的知识点。 1. **Java编程语言**:Java是一种...
此外,压缩包中还包含了一个名为"JdbcUtils笔记源码jar包"的文件,这可能是一个包含了JDBC连接池和数据库操作辅助工具的jar包。其中,JdbcUtils类通常会提供数据库连接的创建、关闭以及批处理等便捷方法,配合...
FMDB是iOS应用开发中广泛使用的SQLite数据库管理库,它为开发者提供了一个高效且易于使用的接口,以便在Objective-C或Swift项目中与SQLite数据库进行交互。这个开源库由Cocoa社区的知名开发者Mike Ash开发,并得到了...
此外,我们还可以实现一个结果集处理类,将ResultSet映射到自定义的Java对象,这通常通过ORM(Object-Relational Mapping)框架如MyBatis或Hibernate完成。这种方法使得数据操作更加面向对象,提高代码的可读性和可...
Hibernate是一个ORM(Object-Relational Mapping)框架,它简化了数据库操作,使开发者可以专注于业务逻辑,而不是底层SQL。 使用Hibernate操作Oracle数据库: 1. 添加Hibernate依赖:在项目中引入Hibernate的jar包...
Swing学生管理系统是一款基于Java开发的桌面应用...总结来说,"Swing学生管理系统"是一个综合运用了Java GUI编程、数据库操作、事件驱动编程等多个核心技能的项目,对于学习和实践Java桌面应用开发具有很高的参考价值。
Apache Commons DBUtils是Java开发中的一个实用工具库,专门用于简化数据库操作。它是一个轻量级的框架,基于Java JDBC API,旨在使数据库编程变得更加简单和健壮。这个"commons-dbutils-1.3"版本是该库的一个早期...
- 在多线程环境下,某些数据库的嵌入式SQL库(如Microsoft SQL Server的ESQL/C)可能不是线程安全的,应避免在多线程中使用,或者限制在单一线程内使用。 - 宿主语言(Host Language)和SQL语句之间的信息交换依赖于...
总的来说,Apache Commons DbUtils是一个非常实用的工具,对于任何需要进行数据库操作的Java应用来说,都是一个值得考虑的选项。其简洁的API和高效的资源管理机制,可以显著提高开发效率并降低出错的可能性。通过...
Java JDBC(Java Database Connectivity)是Java语言中用来规范应用程序如何访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。这份"Java-JDBC资料.rar"压缩包包含了关于Java数据库连接的重要知识...
Boost库是C++编程语言的一个开源库,它提供了大量的可重用库,涵盖了从并发、图形到算法等多个领域,极大地提升了C++的灵活性和效率。在本篇文章中,我们将深入探讨如何在Visual Studio 2008环境下利用Boost库与...
MySQL C++ 封装类是将MySQL数据库的接口与C++编程语言相结合,提供一个更加友好、方便的接口供开发者使用。在Windows环境下,这样的封装类通常会编译成动态链接库(DLL),使得其他C++项目可以方便地调用其中的函数...
MySQL Connector/J是MySQL数据库管理系统与Java应用程序之间的桥梁,它是一个实现了Java Database Connectivity (JDBC) API的驱动程序,使得Java开发者能够轻松地在他们的应用中连接到MySQL服务器,执行SQL查询,...
在"JDBC 比较稳定的JDBC封装(mc)"这个项目中,"mc"可能是指一种特定的、经过优化和稳定化的JDBC使用模式或者库,旨在简化数据库操作,提高代码的可读性和可维护性。 JDBC的主要组件包括以下几个方面: 1. **Driver...
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...
这里我们将深入探讨Java中的一些常用工具类,包括文件操作、字符串处理、时间管理和数据库交互等方面。 1. 文件上传下载:Java的`java.io`和`java.nio`包提供了丰富的文件操作API。例如,`File`类用于文件和目录的...
在数据库操作中,BeanUtils可以将数据库查询结果集(ResultSet)中的每一行映射为一个JavaBean对象,通过RowMapper接口实现。这使得数据处理更加直观,减少了手动映射的繁琐工作。 4. **注意事项** - **空指针...