1

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;
    }

異なるスレッドで複数の選択を実行すると接続が閉じられることを読みました。これは本当ですか、それを解決する方法は?

4

1 に答える 1

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 メソッドを介して参照できます。

于 2012-08-15T10:15:22.937 に答える