【问题标题】:Db4o client doesn't seem to get commit events from other clientsDb4o 客户端似乎没有从其他客户端获取提交事件
【发布时间】:2012-07-13 16:23:07
【问题描述】:

我有一个带有 db4o 服务器的系统,该服务器有两个客户端。一个客户端托管在进程中,另一个是托管许多需要查询数据库的 servlet 的 Web 服务器。

在 web 服务器的连接代码中,我已经注册了提交事件,并按照http://community.versant.com/documentation/reference/db4o-8.0/java/reference/Content/advanced_topics/callbacks/possible_usecases/committed_event_example.htm 的 db4o 文档的建议使用它来刷新对象:

    client = Db4oClientServer.openClient (context.getBean ("db4oClientConfiguration", ClientConfiguration.class),
        arg0.getServletContext ().getInitParameter ("databasehost"),
        Integer.parseInt (arg0.getServletContext ().getInitParameter ("databaseport")),
        arg0.getServletContext ().getInitParameter ("databaseuser"),
        arg0.getServletContext ().getInitParameter ("databasepassword"));

    System.out.println ("DB4O connection established");

    EventRegistry events = EventRegistryFactory.forObjectContainer (client);
    events.committed ().addListener (new EventListener4<CommitEventArgs> () {
        public void onEvent (Event4<CommitEventArgs> commitEvent, CommitEventArgs commitEventArgs)
        {
            for (Iterator4<?> it = commitEventArgs.updated ().iterator (); it.moveNext ();)
            {
                LazyObjectReference reference = (LazyObjectReference) it.current ();
                System.out.println ("Updated object: " + reference.getClass () + ":" + reference.getInternalID ());
                //if (trackedClasses.contains (reference.getClass ()))
                {
                    Object obj = reference.getObject ();
                    commitEventArgs.objectContainer ().ext ().refresh (obj, 1);
                    System.out.println ("  => updated (" + obj + ")");
                }
            }
        }
    });

在进程内客户端中,然后执行以下代码:

    try {
        PlayerCharacter pc = new PlayerCharacter (player, name);
        pc.setBio(bio);
        pc.setArchetype(archetype);
        player.getCharacters ().add (pc);
        database.store (pc);
        database.store (player.getCharacters ());
        database.store (player);
        database.commit ();
        con.sendEvent (id, "CHARACTER_CREATED".getBytes (Constants.CHARSET));
    }
    catch (Exception e) 
    {
        con.sendEvent (id, EventNames.ERROR, e.toString ());
    }

“CHARACTER_CREATED”事件发送成功,所以我知道提交没有引发异常,但其他客户端上没有显示任何内容。它继续使用旧版本的对象,并且我期望的“更新对象”消息不会显示在服务器控制台上。

任何想法我做错了什么?

【问题讨论】:

    标签: java db4o


    【解决方案1】:

    当提交来自其他 TCP 客户端时,显然 .committed() 事件仅在客户端上触发。

    因此,您需要将内部 .openClient() / .openSession() 客户端转换为完整的 TCP 客户端以查看事件。

    .openClient() / .openSession() 对象容器的重量更轻,可以绕过所有与网络通信相关的代码。显然还有整个网络的事件分布。

    【讨论】:

    • 哎哟。那么,我将不得不重新考虑我的一些策略。谢谢你。
    • 顺便说一句,我刚刚意识到我第一次了解 db4o 是从您撰写的关于它的系列博客文章中了解到的。谢谢那些! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2014-10-10
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多