опыт db4o?

В настоящее время я пробую db4o (Java-версию), и мне очень нравится то, что я вижу. Но я не могу не задаться вопросом, как это работает в реальной живой (веб) среде. У кого-нибудь есть опыт (хороший или плохой), которым можно поделиться о работе с db4o?

21.08.2008 21:12:01
4 ОТВЕТА
РЕШЕНИЕ

Мы запускаем версию DB40 .NET в большом клиент-серверном проекте.

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

Тем не менее, вы действительно должны настроить свои объекты, чтобы получить такую ​​производительность. Например, если у вас есть список, содержащий много объектов, DB4O активирует эти списки медленно. Есть несколько способов обойти эту проблему, например, путем обращения отношений.

Другая боль - это активация. Когда вы извлекаете или удаляете объект из DB4O, по умолчанию он активирует все дерево объектов. Например, загрузка Foo будет загружать Foo.Bar.Baz.Bat и т. Д., Пока не останется ничего для загрузки. Хотя это и хорошо с точки зрения программирования, производительность будет замедляться, чем больше вложений в ваши объекты. Чтобы повысить производительность, вы можете указать DB4O, сколько уровней нужно активировать. Это занимает много времени, если у вас много объектов.

Другой областью боли был поиск текста. Текстовый поиск DB4O намного, намного медленнее, чем полнотекстовая индексация SQL. (Они прямо скажут вам об этом на своем сайте.) Хорошая новость заключается в том, что легко установить механизм поиска текста поверх DB4O. В нашем проекте мы подключили Lucene.NET для индексирования нужных текстовых полей.

Некоторые API не работают, например API GetField, полезные при применении обновлений базы данных. (Например, вы переименовали свойство и хотите обновить существующие объекты в базе данных, вам нужно использовать эти API-интерфейсы «отражения» для поиска объектов в базе данных. Другие API, такие как атрибут [Index] don ' t работает в стабильной версии 6.4, и вместо этого вы должны указать индексы, используя Configure (). Index ("someField"), который не является строго типизированным.

Мы стали свидетелями снижения производительности вашей базы данных. Сейчас у нас есть база данных объемом 1 ГБ, и все идет быстро, но не так быстро, как когда мы начинали с маленькой базы данных.

Мы обнаружили еще одну проблему, когда Db4O.GetByID закрывает базу данных, если идентификатор больше не существует в базе данных.

Мы обнаружили, что синтаксис Native Query (наиболее естественный, интегрированный в язык синтаксис для запросов) намного, намного медленнее, чем менее дружественные запросы SODA. Поэтому вместо того, чтобы печатать:

// C# syntax for "Find all MyFoos with Bar == 23".
// (Note the Java syntax is more verbose using the Predicate class.)
IList<MyFoo> results = db4o.Query<MyFoo>(input => input.Bar == 23);

Вместо этого красивого кода запроса вам нужен некрасивый запрос SODA, основанный на строках и не строго типизированный.

Для людей .NET они недавно представили поставщика LINQ-to-DB4O, который обеспечивает лучший синтаксис. Однако еще неизвестно, будет ли производительность соответствовать уродливым запросам SODA.

Поддержка DB4O была приличной: мы разговаривали с ними по телефону несколько раз и получили полезную информацию. Их пользовательские форумы практически бесполезны, однако почти все вопросы остаются без ответа. Их отслеживатель ошибок JIRA получает много внимания, поэтому, если у вас есть ноющая ошибка, ее исправление в JIRA часто будет исправлено. (У нас было 2 ошибки, которые были исправлены, и еще одна, которая была исправлена ​​наполовину.)

Если все это не отпугнуло вас, позвольте мне сказать, что мы очень довольны DB4O, несмотря на проблемы, с которыми мы столкнулись. Производительность, которую мы получили, сместила некоторые фреймворки O / RM, которые мы попробовали. Я рекомендую это.

обновление июль 2015 г. Имейте в виду, что этот ответ был написан еще в 2008 году. Несмотря на то, что я ценю положительные отзывы, с тех пор мир изменился, и эта информация может быть не такой надежной, как на момент ее написания.

55
22.07.2015 16:00:10
Как вы добились, чтобы реализация вашего сервера не блокировалась при обработке запроса? Мы реализовали (я надеюсь!) Довольно наивный клиент-серверный перф-тест, и мы заметили, что длительные запросы блокируют сервер от обработки других. Наши перф-клиентские операции доступны только для чтения.
Peter Mounce 22.10.2008 17:00:30
Пара вещей, которые вы можете попробовать: несколько баз данных, возможно, одна для каждого пользователя. Вы можете использовать режим клиент / сервер DB4O вместо встроенного режима, который обрабатывает многопоточность немного по-другому.
Judah Gabriel Himango 9.02.2009 15:41:34
Привет иуда! Что касается упомянутых вами проблем, глубина активации по умолчанию настроена на 5, поэтому db4o прекратит активацию объектов на глубине 5. Вы также можете попробовать прозрачную активацию (теперь db4o поддерживает собственные коллекции) и позволить db4o активировать ваши объекты только при необходимости (когда объект используется). Что касается Linq, Native Queries и SODA, в большинстве случаев у вас не должно быть заметной разницы в производительности (наиболее распространенный случай таких различий связан с тем, что db4o не находит требуемые сборки - например, Mono.Cecil.dll, Db4objects.Db4o.Instrumentation and Cecil.FlowAnalysis. ).
Vagaus 5.06.2010 16:20:30
Я хотел бы исправить @Vagaus в этом комментарии, есть огромная ощутимая разница в Linq и Native Query, если вы не будете придерживаться ограничений в преобразованиях. Проблема в том, что он возвращается к активации всего этого, когда он не может преобразовать собственный запрос или запрос linq. Также более вероятно появление ошибок при их использовании, в нашем случае мы уже обнаружили 2 обнаруженных ошибки в собственных запросах и 0 в SODA. Не то, чтобы вы не могли получить ошибку в SODA, но, учитывая, что другие сидят на вершине.
eglasius 5.03.2011 00:45:45

Основная проблема, с которой я столкнулся - это отчетность. Кажется, просто нет способа создавать эффективные отчеты для источника данных db4o.

2
18.09.2008 01:12:16
Иногда рекомендуется отправлять данные для отчетов на сервер SQL или в хорошее хранилище данных для отчетов. Это будет проще, потому что вы можете денормализовать это хранилище для облегчения отчетности.
Davy Landman 9.02.2009 15:46:29

Большинство собственных запросов могут и эффективно преобразуются в запросы SODA за кулисами, поэтому это не должно иметь значения. Использование NQ, конечно, предпочтительнее, поскольку вы остаетесь в сфере строго типизированного языка. Если у вас возникли проблемы с использованием NQ для использования индексов, пожалуйста, не стесняйтесь размещать их на форумах db4o, и мы постараемся помочь вам.

Горан

3
28.09.2008 10:10:36

Иуда, похоже, вы не используете прозрачную активацию, что является особенностью последней производственной версии (7.4)? Возможно, если вы указали версию, которую вы используете, поскольку могут быть другие проблемы, которые теперь решены в последней версии?

0
5.10.2008 12:31:48
На момент написания статьи мы использовали 6.4. Мы сейчас используем 7.8. Однако мы все еще не используем прозрачную активацию, потому что она требует, чтобы мы изменили все наши типы списков, чтобы использовать списки DB4O.
Judah Gabriel Himango 9.02.2009 15:43:58