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

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

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

СДО

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

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

Я настоятельно рекомендую H2. Это своего рода "второе поколение" версии HSQLDB, сделанное одним из авторов. H2 позволяет нам тестировать наш DAO-уровень без необходимости использования фактической базы данных PostgreSQL, которая удивительна.

Существует активная сетевая группа и список рассылки, и автор Томас Мюллер очень чувствителен к запросам (ха, мало каламбур там.)

Ответ 3

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

Другой вариант, который предположительно очень быстро, Prevayler.

Ответ 4

Это немного старый вопрос, но в наши дни существует множество баз данных с уровнем производительности 20 000/с. Какую базу данных выбрать, зависит от структуры данных и типа запросов, которые вы хотели бы сделать. Это также зависит от общего объема.

У нас была аналогичная проблема с большим объемом данных временных рядов, около 300 000 рек/с, и мы закончили тем, что создали новую базу данных NFSdb, с достаточно простым API и достойной производительностью. Он может делать около 2 000 000 записей объектов, и мы обошли без ORM. API хранения выглядит примерно так:

JournalFactory factory = new JournalFactory("/mnt1/data/tick");

MyObject o = new MyObject();
try (JournalWriter<MyObject> writer = factory.writer(MyObject.class)) {

   o.setBlah(...);
   writer.append(o);

   // more appends here
   //
   writer.commit();
}

Ответ 5

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

http://hsqldb.org/

Ответ 6

Я бы попробовал OrientDB.

Ответ 7

Chronicle Map - встраиваемая чистая Java-стойкая база данных, обеспечивающая простой интерфейс java.util.Map. Он выдерживает около 1 миллиона запросов/обновлений в секунду из одного потока, обеспечивает постоянную производительность чтения/записи и масштабируется почти линейно до количества ядер в машине.

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

Ответ 8

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

Ответ 9

Вы также можете проверить db4o

Ответ 10

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

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

Ответ 11

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

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

Ответ 12

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

Ответ 13

H2 действительно фантастичен, действительно, в памяти, обычном сервере и транзакционном, у вас есть все. Однако он не сравнивается с производительностью с базами данных объектов, я вижу, что упоминается Db4o, у меня была намного лучшая производительность с Neodatis на самом деле, и все хорошо настроено в репозиториях Maven. Хотя и не очень надежный, как Ferrari, быстрый, но не такой грузовик, как Oracle.

Ответ 14

Вы можете попробовать CSQL (доступно с открытым исходным кодом и корпоративной версией). Он обеспечивает 30-кратное повышение производительности по сравнению с дисковыми системами баз данных и обеспечивает JDBC-интерфейс. Он может быть сконфигурирован для работы в качестве автономной базы данных основной памяти или в виде прозрачного кеша для баз данных MySQL, Postgres, Oracle.