Вопрос

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

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

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

Горан

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

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

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