Высокая производительность базы данных в Java

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

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

JDO

комбинация JPA/ORM/database

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

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

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

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

14 ответов


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

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

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


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

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


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

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


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

у нас была аналогичная проблема с большим объемом данных временных рядов, около 300,000 rec / s, и мы закончили писать новую базу данных NFSdb, С достаточно простым API и достойной производительностью. Это можно сделать 2,000,000 object writes/s, и мы покончили с 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();
}

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

http://hsqldb.org/


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


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

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


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


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


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

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


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


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

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


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


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