DB4O: необходимо использовать GenericList <T>вне использования блока соединения - PullRequest
0 голосов
/ 23 апреля 2011

Я использую DB4O для хранения своих объектов. Ниже приведен код to retrieve objects из DBO4 DB.

public IList<T> GetList<T>()
        {
            IList<T> list = null;
            using (IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), fullFilePath))
            {
                list = db.Query<T>(typeof(T));
            }
            return list;
        }

Вопрос в том, , я НЕ МОЖЕТ применять цикл 'foreach' в C # вне использования блока . Это дает мне ошибку «Исключение типа« Db4objects.Db4o.Ext.DatabaseClosedException »было сгенерировано». как только я начинаю обходить свой список outside of Using block

Я могу применить цикл 'foreach' в C #, используя блок , , но я хочу использовать свой общий список для другого уровня кода. Итак, мне нужен мой общий список объект вне использования блока.

Пожалуйста, дайте мне решение для этого.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2011

Просто добавляем в 'Femaref' ответ и комментарии:

1) Да, вам нужна новая конфигурация для каждого соединения. 2) Открытие базы данных занимает некоторое время. db4o должен прочитать метаданные, проверить, завершены ли транзакции и т. д.

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

Рекомендую немного изменить реализацию. Откройте контейнер объекта при запуске приложения. И закройте его, когда вы закроете приложение. А затем используйте контейнеров сеансов для каждой операции. Это должно быть намного быстрее, так как db4o не нужен для всей работы по инициализации.

Как это:

// Open the container once for the life-time of your application
IObjectConainer rootContainer = Db4oEmbedded.OpenFile(......)

public IList<T> GetList<T>()
{
    using (IObjectContainer db = rootContainer.Ext().OpenSession())
    {
                    // As Femaref said, use to list to 'eagerly' load all data
        return db.Query<T>(typeof(T)).ToList();
    }
}
1 голос
/ 23 апреля 2011

У вас есть две возможности:

  1. обрабатывать удаление объекта db самостоятельно
  2. получить все необходимые данные из базы данных (например, через ToList), что повторяетIEnumerable<T> и вернуть это.
...