2011-06-15 27 views
4

我想为1种方法产生一个线程。我得到一个IllegalStateException(见下文)。这种方法接受连接到数据库和数据库名称,它会从中生成XML。 (这部分的工作,我只是想让它跑得更快了新的线程,因为我有多个XML文件来创建并发数据库访问IllegalStateException

Thread table = new Thread(new Runnable() { 
    public void run() { 
    try { 
    System.out.println("starting"); 
    tableXml(tableConn, dbName); 
    System.out.println("ending"); 
    } 
    catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     } 
    } 
}); 

    table.start(); 

例外:

java.lang.IllegalStateException: Current state = RESET, new state = FLUSHED 
    at java.nio.charset.CharsetEncoder.throwIllegalStateException(CharsetEncoder.java:951) 
    at java.nio.charset.CharsetEncoder.flush(CharsetEncoder.java:640) 
    at java.nio.charset.CharsetEncoder.encode(CharsetEncoder.java:769) 
    at com.informix.lang.JavaToIfxType.doConversion(JavaToIfxType.java:841) 
    at com.informix.lang.JavaToIfxType.JavaToIfxChar(JavaToIfxType.java:145) 
    at com.informix.jdbc.IfxVarChar.toString(IfxVarChar.java:247) 
    at com.informix.jdbc.IfxResultSet.getString(IfxResultSet.java:742) 
    at com.informix.jdbc.IfxResultSet.getString(IfxResultSet.java:785) 
    at org.apache.commons.dbcp.DelegatingResultSet.getString(DelegatingResultSet.java:225) 
    at com.test.ex.ExportTask$1.run(ExportTask.java:151) 
    at java.lang.Thread.run(Thread.java:662) 

的代码行导致该例外的是一个resultSet.executeQuery();

所以,问题是什么呢,我做错了

感谢您的帮助,让我知道,如果你需要的信息

回答

8

看来,这个问题是因为你的代码不是线程安全的。尝试给每个新的线程生成自己的连接,而不是共享应用程序中所有线程之间的单个连接的引用。

4

异常本身与您启动新线程的方式无关。你是“开始线程调用方法”的代码就好了。

例外是CharsetEncoder有关。如果我是你,我会谷歌的东西像IllegalStateException CharsetEncoder和可能线程安全

但是,重要的是,无论您使用的是什么类/框架,都是thread safe

+0

然后你使用的类/框架可能不是线程安全的。阅读文档。 – aioobe 2011-06-15 12:12:44

0

你确定主线程在产生的线程尝试使用它时不重置/关闭连接吗?

如果您处于Java EE环境(或类似的,如Spring)中,则连接通常链接到当前事务,该事务本身链接到当前线程。所以当事务结束时,连接被返回给可用连接池,但你的衍生线程仍在尝试使用它。

+0

我确定连接在所有事情完成前都没有关闭。 – RMT 2011-06-15 12:18:40