Я использую hsqldb для создания кэшированных и индексированных таблиц. Сохраняемые данные имеют довольно высокую частоту, поэтому мне нужно использовать пул соединений. Кроме того, поскольку данных много, я не вызываю контрольную точку при каждой фиксации, а скорее ожидаю, что данные будут сброшены после вставки 50 000 строк. Итак, дело в том, что я вижу, что файл .data растет, но когда я подключаюсь к клиенту hsqldb, я не вижу таблиц и данных. Итак, у меня было 2 простых теста: один вставил одну строку и один вставил 60 000 строк в новую таблицу. В обоих случаях я не мог увидеть результат ни в одном клиенте hsqldb. (Обратите внимание, что я использую shutdown=true). Поэтому, когда я добавляю контрольную точку после каждой фиксации, это решает проблему. Кроме того, если указать в строке подключения использование журнала, это решает проблему (хотя мне не нужен журнал в производстве). Кроме того, неиспользование объединенного соединения решило проблему, и последнее использует объединенный источник данных и явно закрывает его перед завершением работы.
Итак, я предполагаю, что некоторые соединения в пуле соединений не закрываются, что не позволяет базе данных каким-то образом зафиксировать изменения и сделать их доступными для клиента. Но тогда почему я не мог увидеть результат даже с 60 000 строк? Я также ожидал, что пул будет закрыт автоматически... Что я делаю неправильно? Что происходит за кулисами?
Код для получения источника данных выглядит так:
Class.forName("org.hsqldb.jdbcDriver");
String url = "jdbc:hsqldb:" + m_dbRoot + dbName + "/db" + ";hsqldb.log_data=false;shutdown=true;hsqldb.nio_data_file=false";
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, user, password);
GenericObjectPool connectionPool = new GenericObjectPool();
KeyedObjectPoolFactory stmtPool = new GenericKeyedObjectPoolFactory(null);
new PoolableConnectionFactory(connectionFactory, connectionPool, stmtPool, null, false, true);
DataSource ds = new PoolingDataSource(connectionPool);
И я использую этот объединенный источник данных для создания таблицы:
Connection c = m_dataSource.getConnection();
Statement st = c.createStatement();
String script = String.format("CREATE CACHED TABLE IF NOT EXISTS %s (id %s NOT NULL, entity %s NOT NULL, PRIMARY KEY (id));", m_tableName, m_idGenerator.getIdType(), TABLE_ENTITY_TYPE);
st.execute(script);
c.close;
st.close();
И вставьте строки:
Connection c = m_dataSource.getConnection();
c.setAutoCommit(false);
Statement stmt = c.prepareStatement(m_sqlInsert);
stmt.setObject(1, id);
stmt.setBinaryStream(2, Serializer.Helper.serialize(m_serializer, entity));
stmt.executeUpdate();
stmt.close();
stmt = null;
c.commit();
c.close();
stmt.close();
поэтому вышеприведенное, кажется, добавляет данные, но их нельзя увидеть. Когда я явно вызвал connectionPool.close(); Тогда и только тогда я увидел результат. Я также пытался использовать JDBCDataSource, и это тоже сработало. Так, что происходит? И как это правильно сделать?