Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LoadableDetachableModel多线程问题_Java_Multithreading_Wicket - Fatal编程技术网

Java LoadableDetachableModel多线程问题

Java LoadableDetachableModel多线程问题,java,multithreading,wicket,Java,Multithreading,Wicket,我们遇到了一个问题,很多用户访问了一个有很多ajax调用的页面。我们花了很长时间才完成,最终在LoadableDetachableModel中发现了一个线程问题 我认为问题与我们在会话中有一个用户模型这一事实有关。此用户模型扩展了LoadableDetachableModel。如果load()方法花费太长时间返回,那么第二个线程可能会返回一个空用户,因为在调用load()和设置transientModelObject之前,附加的标志被设置为true。为了解决这个问题,我们只是制作了我们自己的Lo

我们遇到了一个问题,很多用户访问了一个有很多ajax调用的页面。我们花了很长时间才完成,最终在LoadableDetachableModel中发现了一个线程问题

我认为问题与我们在会话中有一个用户模型这一事实有关。此用户模型扩展了LoadableDetachableModel。如果load()方法花费太长时间返回,那么第二个线程可能会返回一个空用户,因为在调用load()和设置transientModelObject之前,附加的标志被设置为true。为了解决这个问题,我们只是制作了我们自己的LoadableDetachableModel的修改版本,在必要时添加了同步。从那以后,我们再也没有问题了

我查看了Wicket Jira站点,甚至查看了fisheye中的一些提交,看看这个问题是否已经解决,因为我注意到Wicket 7没有附加的标志。相反,它有一个名为InternalState的枚举来修复WICKET-5916。wicket的7.2版本中似乎仍然存在线程问题。代码如下:

    @Override
public final T getObject()
{
    if (state == null || state == InternalState.DETACHED)
    {
        // prevent infinite attachment loops
        state = InternalState.ATTACHING;//<--One thread sets this, next thread gets a null object returned since load() has not completed

        transientModelObject = load();

        if (log.isDebugEnabled())
        {
            log.debug("loaded transient object " + transientModelObject + " for " + this +
                ", requestCycle " + RequestCycle.get());
        }

        state = InternalState.ATTACHED;
        onAttach();
    }
    return transientModelObject;
}
@覆盖
公共最终T getObject()
{
if(state==null | | state==InternalState.DETACHED)
{
//防止无限连接循环

state=InternalState.ATTACHING;//IModel是组件使用的接口,所有组件都是单线程的。
不要在会话或应用程序中使用模型。

IModel是组件使用的接口,所有组件都是单线程的。
不要在会话或应用程序中使用模型。

将LDM放入会话中,您试图实现什么?何时分离?会话有分离方法。我们在那里分离它。将LDM放入会话中,您试图实现什么?何时分离?会话有分离方法。我们在那里分离它。因此,建议使用k在会话中保护用户不是通过会话分离时分离的某个IModel实现的?我想这很好,但我已经这样做了10年了。LoadableDetachableModel的想法非常适合于每个请求加载一个用户,但是在考虑了我们的经验和您的响应后,我认为它是最好使用flyweight模式,创建用户的轻量级可序列化版本,并在用户登录时存储。顺便感谢您的回答。如果您有时间,请告诉我您是否有在会话中存储用户的最佳做法。我们的产品用户之一为wicket auth角色,而另一个没有。o不使用身份验证角色的网元就是出现问题的网元。需要明确的是:您可以在页面中使用LDM,它从会话中获取用户标识符,并从数据库中加载完整的实体。请注意,这样的设置不会带来任何线程问题。因此,建议的将用户保留在会话中的方法不是通过一些IModel在会话分离时会分离?我想这很好,但我已经这样做了10年了。LoadableDetachableModel的想法非常适合每个请求加载一次用户,但是在考虑了我们的经验和您的响应后,我认为使用flyweight pat会更好tern并创建用户的轻量级可序列化版本,并在用户登录时存储。顺便感谢您的回答。如果您有时间,请告诉我您是否有在会话中存储用户的最佳做法。我们的产品用户之一使用wicket auth角色,而另一个不使用。不使用auth角色的是one有问题。只是要澄清一下:您可以在页面中使用LDM,它从会话中获取用户标识符,并从数据库中加载完整的实体。请注意,这样的设置不会带来任何线程问题。