Сохранение базы данных H2 в памяти на диск

Как я могу сохранить / загрузить полную встроенную базу данных h2 в памяти в какой-либо файл или каталог в двоичном режиме для более быстрой загрузки.

Я хочу использовать это для кэширования данных, поэтому мне не нужно каждый раз запускать все строки предложений создания таблицы/вставки.


person mikkom    schedule 07.03.2012    source источник
comment
Можете ли вы просто использовать файловую БД вместо версии в памяти? Я предполагаю, что вы занимаетесь пользовательской разработкой с использованием платформы (например, Grails), которую вы не упомянули.   -  person Marc    schedule 07.03.2012
comment
Это пользовательский проект без каких-либо фреймворков. Честно говоря, я не уверен, каковы последствия файловой базы данных для производительности, мне нужна скорость, и данные всегда будут помещаться в памяти, поэтому я предположил, что база данных в памяти будет самой быстрой. Данные будут только запрашиваться, поэтому мне не нужны ненужные проверки сохранения.   -  person mikkom    schedule 07.03.2012
comment
@marc Использование «файловой БД» - это другое дело. Было бы очень полезно в модульном тесте, если бы можно было настроить набор тестовых данных в памяти с помощью java или любого другого языка, затем сделать резервную копию набора данных и использовать его для восстановления исходного состояния после каждого теста.   -  person Lars Bohl    schedule 20.04.2013


Ответы (2)


Вместо использования базы данных в памяти вы можете использовать обычную (постоянную) базу данных. Даже в этом случае вы можете использовать таблицы в памяти (создать таблицу памяти).

Самый простой способ сохранить полностью находящуюся в памяти базу данных на диске — это использовать SCRIPT TO 'fileName' Оператор SQL. Это создаст сценарий SQL. Данные хранятся в текстовом виде, что кажется не самым эффективным решением. Однако обычно узким местом в любом случае является диск, а не форматирование/анализ текста.

Другой вариант — создать другую базу данных, связать таблицы с базой данных в памяти (используя создать связанную таблицу или функцию link_schema), а затем используйте создать таблицу как выбранную, чтобы сохранить таблицы.

person Thomas Mueller    schedule 07.03.2012
comment
Вставка оговорок - это то, что я сейчас делаю, и для 1 гига текста это занимает некоторое время, и это не io. извините, но я хочу бинарный опцион. - person mikkom; 08.03.2012
comment
Обновил мой ответ. Для СКРИПТА: если это не IO, то что тогда? Использовали ли вы инструмент профилирования, такой как встроенный профайлер? - person Thomas Mueller; 08.03.2012

Как я выяснил, можно использовать виртуальную ФС H2, которая намного быстрее, чем ФС по умолчанию. Итак, я делаю так:

//to save dump
connection.prepareStatement("SCRIPT TO 'memFS:data.sql'").execute();
//to load dump
connection.prepareStatement("RUNSCRIPT FROM 'memFS:data.sql'").execute();
person Pavel_K    schedule 23.10.2020