"リモート" H2データベース(実際にはローカル・ドライブにありますが、tcpを使用してアクセスします)の表から1つのテキスト列(CLOB)を取り出し、最初の100プログラムは、結果セットの次の行を検索する際にハングします。一方、組み込みデータベースと同じデータベースにアクセスする場合は問題ありません。私は、サーバー(つまりTCP)メソッドを使用してデータベースにアクセスするH2のコンソールアプリケーションを使用して、テーブルの行を表示しようとすると、私は、次のエラーメッセージが表示されます。CLOB
IO Exception: "java.io.IOException: org.h2.message.DbException: The object is already closed [90007-164]";
"lob: null table: 14 id: 1" [90031-164] 90031/90031
ここでプログラムです。システムプロパティを設定する呼び出しのコメントを外すと、プログラムが機能します。私はまた、文字ストリームを使用して列を取得しようとしました。または単に定数USE_STREAMによって制御されるgetStringを呼び出しました。ここで
import java.sql.*;
import java.util.*;
import java.io.*;
public class Jdbc4
{
private static final boolean USE_STREAM = false;
public static void main(String[] args) throws Exception
{
//System.setProperty("h2.serverResultSetFetchSize", "50");
Connection conn = null;
try {
Class.forName("org.h2.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:h2:tcp://localhost/file:C:/h2/db/test/test;IFEXISTS=TRUE", "sa", "");
Statement stmt = conn.createStatement();
String sql = "select select_variables from ipm_queues";
ResultSet rs = stmt.executeQuery(sql);
int count = 0;
while (rs.next()) {
++count;
String s;
if (USE_STREAM) {
Clob clob = rs.getClob(1);
Reader rdr = clob.getCharacterStream();
char[] cbuf = new char[1024];
StringBuffer sb = new StringBuffer();
int len;
while ((len = rdr.read(cbuf, 0, cbuf.length)) != -1)
sb.append(cbuf, 0, len);
rdr.close();
s = sb.toString();
clob.free();
}
else
s = rs.getString(1);
System.out.println(count + ": " + s);
}
}
finally {
if (conn != null)
conn.close();
}
}
}
はDDLは、(あなたはそれが最初にMySQLのテーブルだった見ることができます)テーブルを作成するためのものです::あり結果に違いはありません
CREATE TABLE `ipm_queues` (
`oid` bigint NOT NULL,
`queue_id` varchar(256) NOT NULL,
`store_id` bigint NOT NULL,
`creation_time` datetime NOT NULL,
`status` bigint NOT NULL,
`deleted` bigint NOT NULL,
`last_mod_time` datetime NOT NULL,
`queue_name` varchar(128),
`select_variables` text,
`where_clause` text,
`from_table` varchar(128),
`order_by` varchar(256),
`from_associate_table` varchar(256),
`from_view` varchar(128)
);
ALTER TABLE ipm_queues
ADD CONSTRAINT ipm_queues_pkey PRIMARY KEY (oid);
CREATE UNIQUE INDEX ipm_queues_key_idx ON ipm_queues(queue_id, store_id);
CREATE INDEX ipm_queues_str_idx ON ipm_queues(store_id);
データを読み取るために使用したコードを投稿することはできますか? "オブジェクトはすでに閉じられています"というエラーメッセージは、予期せぬJDBC呼び出しのように聞こえます(私は間違っているとは言いませんが、予期せぬことです)。アプリケーションコードを見ることなく、どこに問題があるのかは分かりません。 –
"オブジェクトは既に閉じられています"というエラーメッセージは、クエリを入力するとH2 Consoleアプリケーションによって生成されます。 – RonAaaronson
select * from ipm_queues; (エラーメッセージは私のコードのものではありません) – RonAaaronson