多线程中操作数据库,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这样读的.

[b]问题补充:[/b]
我的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是怎么生成的?

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

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

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