Мне нужны идеи для реализации (действительно) высокопроизводительного механизма базы данных / хранения в памяти на Java. В диапазоне хранения 20000+ java-объектов, обновляемых примерно каждые 5 секунд. Я открыт для некоторых вариантов:
Чистая комбинация JDBC / базы данных
JDO
Комбинация JPA / ORM / базы данных
База данных объектов
Другие механизмы хранения
Какой у меня лучший вариант? Какой у вас опыт?
Обновлено: мне также нужно иметь возможность запрашивать эти объекты




Попробуйте следующее, он отлично работает с Hibernate и другими фреймворками ORM.
Если вы хотите сохранить все свои данные в памяти, вы можете посмотреть Превайлер.
Я никогда не использовал его сам, но мне кажется, что это намного лучшее решение, чем использование реляционной базы данных для тех случаев, когда все ваши данные могут храниться в памяти.
Я не знаю, самый ли это вариант, но я был очень доволен H2 всякий раз, когда я его использовал. Он написан тем же человеком, который изначально написал Hypersonic (который позже стал HSQLDB).
Другой вариант, который якобы очень быстрый, - это Превайлер.
Зависит от вашего определения «базы данных». Это определенно не реляционная база данных, но, похоже, она соответствует минимальному определению базы данных.
ну, я думаю, это правда. я имел в виду, что он хранит столько данных, сколько вы можете иметь в ОЗУ.
Вы можете попробовать что-то вроде Превайлер (в основном кеш в памяти, который обрабатывает сериализацию и резервное копирование для вас, чтобы данные сохранялись и были безопасны для транзакций). Есть и другие подобные проекты. Я использовал его для большого проекта, это безопасно и очень быстро.
Если это тот же набор из 20000 объектов или, по крайней мере, не 20000 новых объектов каждые 5 секунд, но много изменений, вам может быть лучше кэшировать изменения и периодически записывать изменения в пакетном режиме (пакетные обновления jdbc выполняются намного быстрее, чем отдельные строки обновления). Зависит от того, нужна ли вам транзакционная упаковка для каждой записи и нужна ли вам запись журналов изменений или просто агрегированные изменения.
Редактировать: поскольку в других сообщениях упоминался Prevayler, я подумал, что оставлю заметку о том, что он делает: По сути, вы создаете доступный для поиска / сериализуемый объект (обычно какой-то Map), который обернут в экземпляр Prevayler, который сериализуется на диск. Вместо того, чтобы вносить изменения непосредственно в вашу карту, вы вносите изменения, отправляя своему экземпляру Prevayler сериализуемую запись вашего изменения (просто объект, содержащий инструкцию изменения). Версия транзакции Prevayler заключается в записи ваших изменений сериализации на диск, чтобы в случае сбоя она могла загрузить последнюю полную резервную копию, а затем воспроизвести изменения для нее. Это безопасно, хотя у вас должно быть достаточно памяти для загрузки всех ваших данных, и это довольно старый API, поэтому, к сожалению, нет общих интерфейсов. Но определенно стабильно и работает как рекламируется.
Документация на сайте не очень обширна, но в загружаемой библиотеке есть демо. Использование довольно простое.
hsqldb довольно быстр, но он не безопасен для транзакций ACID. Самая быстрая java-база данных, которую я знаю, - это db4o: ориентиры.
Редактировать: Обратите внимание, что Prevayler не является базой данных, см. http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase. Если у вас закончилась оперативная память, вам не повезло.
Berkeley DB для Java - это быстрая база данных в памяти, чрезвычайно полезная для простых графов объектов.
Хмм. BDB - это НЕ база данных в памяти, а база данных на диске. Очевидно, что он может кэшировать большую часть своего содержимого в памяти, как и все готовые к производству БД, но я не знаю, есть ли у него даже режим только памяти.
Терракота также может быть для вас ответом. Он позволяет нескольким виртуальным машинам совместно использовать объекты, чтобы вы могли распределять нагрузку и т. д.
Я очень рекомендую H2. Это своего рода версия HSQLDB «второго поколения», созданная одним из первоначальных авторов. H2 позволяет нам проводить модульное тестирование нашего уровня DAO, не требуя реальной базы данных PostgreSQL, которой является классно.
Есть активная сетевая группа и список рассылки, а автор Томас Мюллер очень отзывчив к запросам (ха-ха, там немного каламбура).
Вы можете попробовать CSQL (доступен в версии с открытым исходным кодом и в корпоративной версии). Он обеспечивает 30-кратное повышение производительности по сравнению с дисковыми системами баз данных и предоставляет интерфейс JDBC. Его можно настроить для работы в качестве автономной базы данных в основной памяти или в качестве прозрачного кеша для баз данных MySQL, Postgres, Oracle.
Вы также можете проверить db4o
H2 действительно фантастичен, действительно, в памяти, нормальном сервере и транзакциях, у вас есть все. Однако он не сравнивается по производительности с объектными базами данных, я вижу, что Db4o упоминается, на самом деле у меня была намного лучшая производительность с Neodatis, и все хорошо настроено в репозиториях Maven. Хоть и не очень крепкий, как Ferrari, но быстрый, но не грузовик, как Oracle.
Я бы попробовал OrientDB.
Это немного старый вопрос, но в наши дни существует множество баз данных с уровнем производительности 20 000 / с. Выбор базы данных зависит от структуры данных и типа запросов, которые вы хотите сделать. Это также зависит от общей громкости.
У нас была аналогичная проблема с большим объемом данных временных рядов, около 300 000 записей в секунду, и в итоге мы написали новую базу данных с достаточно простым API и приличной производительностью. Он может выполнять около 2 000 000 операций записи в секунду, и мы отказались от ORM.
Позже он превратился в QuestDB.
Хроника карта - это встраиваемая постоянная база данных на чистом Java, обеспечивающая простой интерфейс java.util.Map. Он выдерживает около 1 миллион запросов / обновлений в секунду из одного потока, стабильную производительность чтения / записи и почти линейно масштабируется в зависимости от количества ядер в машине.
Вот некоторые недавние исследования производительности с фактическими цифрами:
превайлер это не база данных: prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase