2

Db4o で新しいオブジェクトを永続的な IObjectContainer にロードすることは可能ですか?

起動時に 1 つの接続 (IObjectContainer) を開くデスクトップ アプリケーションがあります。すべてのオブジェクトを次のようにクエリすると:

var objects = from DummyClass foo in session
              select foo

すべてのオブジェクトを完全に選択します。ただし、この後に別のクライアントが新しいクラスを追加した場合、同じクエリは引き続き同じオブジェクトを選択し、新しいオブジェクトは選択しません。

私も知っています:

session.Ext().Refresh(obj, int.MaxValue);

しかし、新しいオブジェクトへの参照をアクティブ化していないので、そこにあります。新しいオブジェクトを更新するには?

注意: データが必要になるたびにセッションを開いたり閉じたりしたくありません。OODB (透過的なアクティブ化、ロード後のオブジェクトの永続性など) を利用したいのです。

ありがとうございました

UPDATE (理解を深めるためのコード例)

// store one class to fill database with some data
using (var mainSession = SessionFactory.CreateNewConnection())
{
    mainSession.Store(new DummyClass());
    mainSession.Commit();
}

using (var mainSession = SessionFactory.CreateNewConnection())
{
    // returns one object
    var objects = from DummyClass foo in session
                 select foo;
    using (var secondSession = SessionFactory.CreateNewConnection())
    {
        secondSession.Store(new DummyClass());
        secondSession.Commit();
    }

    // this loop reload objects known for mainSession (which is not new object)
    foreach (var obj in objects2)
    {
        mainSession.Ext().Refresh(obj, int.MaxValue);
    }

    // new DummyClass is commited but still not visible (Read-Commited isolation)
    // returns one object
    var objects2 = from DummyClass foo in session
                  select foo;
}

using (var mainSession = SessionFactory.CreateNewConnection())
{
    // returns two objects
    var objects = from DummyClass foo in session
                 select foo;
}

次のようなものが必要です:

// refresh all objects of DummyClass
session.Ext().Refresh(typeof(DummyClass), int.MaxValue);
4

2 に答える 2

1

コミットされたイベントを使用できます。

using Db4objects.Db4o;
using Db4objects.Db4o.Events;
using Db4objects.Db4o.IO;
using Db4objects.Db4o.Ext;

namespace PushedUpdates
{
    class Program
    {
        static void Main()
        {
            var config = Db4oEmbedded.NewConfiguration();
            config.File.Storage = new MemoryStorage();
            var container = Db4oEmbedded.OpenFile(config, "IN-MEMORY");

            var client = container.Ext().OpenSession();

            var clientEvents = EventRegistryFactory.ForObjectContainer(client);
            clientEvents.Committed += (s, a) =>
                                        {
                                            foreach(IObjectInfo added in a.Added)
                                            {
                                                System.Console.WriteLine(added.GetObject());
                                            }
                                        };

            container.Store(new Item { Value = 1 } );
            container.Commit();
            container.Store(new Item { Value = 2 });
            container.Commit();
            container.Store(new Item { Value = 3 });
            container.Commit();

            client.Close();
            container.Close();
        }
    }

    class Item
    {
        public int Value { get; set; }

        public override string ToString()
        {
            return "" + Value;
        }
    }
}
于 2011-11-18T22:49:28.883 に答える
1

データを保存した後、クライアントは commit() メソッドを呼び出しましたか? そうしないと、他のクライアントが新しいデータを利用できなくなります。

于 2011-11-18T21:17:59.817 に答える