java - 多线程中的ExecuteQuery关闭hsqldb数据库连接

标签 java multithreading hsqldb

我正在尝试改进从 hsqldb 选择数据的函数,因此我尝试在多个线程中运行它,但出现以下异常:

java.sql.SQLNonTransientConnectionException: connection exception: closed
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatementBase.checkClosed(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatementBase.getResultSet(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.getResultSet(Unknown Source)
    at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)

这是我每次尝试在新线程中运行它的函数:

public List<String> getAllClassNames(boolean concrete) throws ClassMapException {
        List<String> result = new ArrayList<String>();


        try {
            ResultSet rs = null;
            Connection connection = DBConnection.getConnection();
            Statement st = connection.createStatement();
            if (concrete)
                rs = st.executeQuery("select cd_name from CLASS_DESCRIPTORS where CD_CONCRETE=true  order by cd_name");
            else
                rs = st.executeQuery("select cd_name from CLASS_DESCRIPTORS order by cd_name");
            while (rs.next()) {
                result.add(rs.getString("cd_name"));
            }
        } catch (SQLException e) {
            _log.error("SQLException while retrieve all class names." + e.getMessage(), e);
            throw new ClassMapException("SQLException while retrieve all class names." + e.getMessage(), e);
        } finally {
            DBConnection.closeConnection();
        }
        return result;
    }

我读到通过不同线程执行多个选择会关闭连接。这是真的吗?如何解决?

最佳答案

连接似乎已关闭,因为该函数使用了相同的连接,并且在第一次使用后就关闭了。检查您的 DBConnection 类是如何编写的。

代码中还存在其他问题,例如语句 st 从未关闭,或者语句未准备好然后重用。

您还可以使用 HSQLDB 中的 ARRAY_AGG 函数返回数组,而不是自己创建数组。下面给出了指南的链接和使用示例。

http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#N12538

select array_agg(cd_name order by cd_name) as arr from CLASS_DESCRIPTORS where CD_CONCRETE=true

Array array = rs.getArray(1)

该数组是一个 JDBC 数组,可以通过其 JDBC 方法引用。

关于java - 多线程中的ExecuteQuery关闭hsqldb数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11967361/

相关文章:

java - 将动态应用程序部署到 Eclipse 上的 Tomcat 服务器后,Spring Web REST API 的 HTTP 状态 404

java - 这是 fork in join 的正确代码吗?

java - 如何根据 JavaFx 中标签中的文本调整 VBox 和 Label 的大小?

java - 下面的线程代码中的synchronized是如何工作的,代码流程是怎样的?

java - Android for 循环中的 “Only the original thread that created a view hierarchy can touch its views.” 错误

java - HSQLDB 独立用于单元测试

java - 有没有办法在运行时向tomcat添加端口?

c - for 循环中的 pthread_exit 困惑

java - 连接 HSQL 数据库管理器时无法从 Java 代码连接到 HSQL 数据库

oracle - DbUnit HSQLDB - 无效的架构名称 : C