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

时间:2012-08-15 10:00:26

标签: 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;
    }

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

1 个答案:

答案 0 :(得分:1)

似乎连接已关闭,因为该功能使用了相同的连接,并在首次使用后关闭。检查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方法引用。