База данных с высочайшей производительностью на Java

Мне нужны идеи для реализации (действительно) высокопроизводительного механизма базы данных / хранения в памяти на Java. В диапазоне хранения 20000+ java-объектов, обновляемых примерно каждые 5 секунд. Я открыт для некоторых вариантов:

Чистая комбинация JDBC / базы данных

JDO

Комбинация JPA / ORM / базы данных

База данных объектов

Другие механизмы хранения

Какой у меня лучший вариант? Какой у вас опыт?

Обновлено: мне также нужно иметь возможность запрашивать эти объекты

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
15
0
31 264
14
Перейти к ответу Данный вопрос помечен как решенный

Ответы 14

Попробуйте следующее, он отлично работает с Hibernate и другими фреймворками ORM.

http://hsqldb.org/

Если вы хотите сохранить все свои данные в памяти, вы можете посмотреть Превайлер.

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

Я не знаю, самый ли это вариант, но я был очень доволен H2 всякий раз, когда я его использовал. Он написан тем же человеком, который изначально написал Hypersonic (который позже стал HSQLDB).

Другой вариант, который якобы очень быстрый, - это Превайлер.

превайлер это не база данных: prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase

nes1983 13.01.2009 21:52

Зависит от вашего определения «базы данных». Это определенно не реляционная база данных, но, похоже, она соответствует минимальному определению базы данных.

Dan Dyer 13.01.2009 22:04

ну, я думаю, это правда. я имел в виду, что он хранит столько данных, сколько вы можете иметь в ОЗУ.

nes1983 15.01.2009 23:15
Ответ принят как подходящий

Вы можете попробовать что-то вроде Превайлер (в основном кеш в памяти, который обрабатывает сериализацию и резервное копирование для вас, чтобы данные сохранялись и были безопасны для транзакций). Есть и другие подобные проекты. Я использовал его для большого проекта, это безопасно и очень быстро.

Если это тот же набор из 20000 объектов или, по крайней мере, не 20000 новых объектов каждые 5 секунд, но много изменений, вам может быть лучше кэшировать изменения и периодически записывать изменения в пакетном режиме (пакетные обновления jdbc выполняются намного быстрее, чем отдельные строки обновления). Зависит от того, нужна ли вам транзакционная упаковка для каждой записи и нужна ли вам запись журналов изменений или просто агрегированные изменения.

Редактировать: поскольку в других сообщениях упоминался Prevayler, я подумал, что оставлю заметку о том, что он делает: По сути, вы создаете доступный для поиска / сериализуемый объект (обычно какой-то Map), который обернут в экземпляр Prevayler, который сериализуется на диск. Вместо того, чтобы вносить изменения непосредственно в вашу карту, вы вносите изменения, отправляя своему экземпляру Prevayler сериализуемую запись вашего изменения (просто объект, содержащий инструкцию изменения). Версия транзакции Prevayler заключается в записи ваших изменений сериализации на диск, чтобы в случае сбоя она могла загрузить последнюю полную резервную копию, а затем воспроизвести изменения для нее. Это безопасно, хотя у вас должно быть достаточно памяти для загрузки всех ваших данных, и это довольно старый API, поэтому, к сожалению, нет общих интерфейсов. Но определенно стабильно и работает как рекламируется.

Документация на сайте не очень обширна, но в загружаемой библиотеке есть демо. Использование довольно простое.

Steve B. 14.01.2009 01:40

hsqldb довольно быстр, но он не безопасен для транзакций ACID. Самая быстрая java-база данных, которую я знаю, - это db4o: ориентиры.

Редактировать: Обратите внимание, что Prevayler не является базой данных, см. http://www.prevayler.org/wiki.jsp?topic=PrevaylerIsNotADatabase. Если у вас закончилась оперативная память, вам не повезло.

Berkeley DB для Java - это быстрая база данных в памяти, чрезвычайно полезная для простых графов объектов.

Хмм. BDB - это НЕ база данных в памяти, а база данных на диске. Очевидно, что он может кэшировать большую часть своего содержимого в памяти, как и все готовые к производству БД, но я не знаю, есть ли у него даже режим только памяти.

StaxMan 17.03.2010 03:48

Терракота также может быть для вас ответом. Он позволяет нескольким виртуальным машинам совместно использовать объекты, чтобы вы могли распределять нагрузку и т. д.

Я очень рекомендую 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 миллион запросов / обновлений в секунду из одного потока, стабильную производительность чтения / записи и почти линейно масштабируется в зависимости от количества ядер в машине.

Вот некоторые недавние исследования производительности с фактическими цифрами:

Другие вопросы по теме