并发数据库访问给出IllegalStateException

时间:2011-06-15 12:03:34

标签: java multithreading

我正在尝试为1个方法生成一个线程。我得到IllegalStateException(见下文)。这个方法接受数据库连接和数据库名称,它将从中生成XML。 (那部分是有效的我只是想通过一个新线程让它更快,因为我有多个XML文件要创建。

    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();

所以问题是:我做错了什么?

感谢您的帮助,如果您需要信息,请与我们联系

3 个答案:

答案 0 :(得分:8)

似乎问题是因为您的代码不是线程安全的。尝试为每个新生成的线程提供自己的连接,而不是共享应用程序中所有线程之间的单个连接的引用。

答案 1 :(得分:4)

异常本身与您启动新线程的方式无关。你是“start-thread-call-method”代码就好了。

例外CharsetEncoder相关。如果我是你,我会google类似 IllegalStateException CharsetEncoder 以及可能的线程安全

然而,重要的是,您同时使用的类/框架是thread safe

答案 2 :(得分:0)

在生成的线程尝试使用它时,您确定主线程没有重置/关闭连接吗?

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