Вопрос

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

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

JDO

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

Объектная база данных

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

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

Редактировать:Мне также нужно, чтобы like мог запрашивать эти объекты

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Это немного старый вопрос, но в наши дни существует множество баз данных, производительность которых составляет 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();
}

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

http://hsqldb.org/

Я бы попробовал, чтобы OrientDB ( Ориентация ).

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

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

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

Вы также можете проверить db4o ( дб4о )

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top