什么编程实践导致Tridion报告在另一个线程上使用会话?

Dom*_*nin 8 tridion

在我的Tridion内容管理服务器上检查事件日志时,(我正在使用2009版本),我看到警告说:

Session is used on another thread... than it was created on ... 
Session objects are not thread safe.
Run Code Online (Sandbox Code Playgroud)

什么编程/模板实践可能会导致这种情况?

编辑:到目前为止,我们有一些很好的建议:

  1. 不要将会话对象存储在静态变量中(Chris)
  2. 不要将引擎或包存储在静态变量中(Miguel)

事实上,这两个都是纯金,你应该检查自己的代码以获得这些反模式.(引擎有一个对会话的引用,所以这是有道理的.)尽管如此,我已经搜索了导致问题的代码库,但我还没有找到任何这些.那么 - 有没有人有更多的想法?我也欢迎有关如何调试此类事情或缩小有问题代码的建议.

Fra*_*len 9

问题存储任何TOM.NET对象时(不只是来有关储存会话时,还Component,Page等).每个这样的对象都有一个对Session的内部引用,它是从对对象的任何访问创建的,可能必须返回Session才能从Tridion中检索所请求的信息.

尽管大多数属于项目类型"本机"的属性似乎都被检索并保存在实例上,但是LoadApplicationData可能(必须)调用回到会话以访问所请求的数据.如果此调用发生在另一个线程上,您将收到您提到的警告消息.

我已经开始查看我怀疑的每个TOM.NET对象,并预先加载我在稍后从Session中加载对象时可能需要的大量数据.


Mig*_*uel 8

我还想根据以前的经验添加评论.以下场景:

  • 会话和/或引擎和/或包存储在静态变量中
  • 会话和/或引擎和/或包作为参数发送到静态方法

可能导致前面描述的几个问题,包括发布期间的内存泄漏.

Publisher将开始消耗内存,直到最终处于非响应模式(您无法停止,也无法重新启动或禁用),您需要重新启动服务器.

在进行大规模发布时,这些问题可能会变得越来越糟

所以建议使用session,engine,package的任何东西都应该转换为非静态的

例如,从以下用于初始化所有模板中使用的实用程序的代码移动

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using Tridion;
using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.ContentManagement.Fields;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Publishing;


namespace sample.sample1
{
    public class Utilities
    {
        private static Engine  _engine;
        private static Package _package;

        public void InitializeUtilities(Engine e, Package p)
        {
            _engine = e;
            _package = p;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using Tridion;
using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.ContentManagement.Fields;
using Tridion.ContentManager.Templating;
using Tridion.ContentManager.Publishing;


namespace sample.sample1
{
    public class Utilities
    {
        private Engine _engine;
        private Package _package;

        public void InitializeUtilities(Engine e, Package p)
        {
            _engine = e;
            _package = p;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

可以节省很多问题


Chr*_*ers 6

我发现,如果您将会话对象存储在模板中的静态变量中,则会发生此错误.它在调试模式下工作正常,但是一旦我运行多线程Publisher(即多个渲染线程),这个问题就会引起它的丑陋.