在我的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)
什么编程/模板实践可能会导致这种情况?
编辑:到目前为止,我们有一些很好的建议:
事实上,这两个都是纯金,你应该检查自己的代码以获得这些反模式.(引擎有一个对会话的引用,所以这是有道理的.)尽管如此,我已经搜索了导致问题的代码库,但我还没有找到任何这些.那么 - 有没有人有更多的想法?我也欢迎有关如何调试此类事情或缩小有问题代码的建议.
问题存储任何TOM.NET对象时(不只是来有关储存会话时,还Component
,Page
等).每个这样的对象都有一个对Session的内部引用,它是从对对象的任何访问创建的,可能必须返回Session才能从Tridion中检索所请求的信息.
尽管大多数属于项目类型"本机"的属性似乎都被检索并保存在实例上,但是LoadApplicationData
可能(必须)调用回到会话以访问所请求的数据.如果此调用发生在另一个线程上,您将收到您提到的警告消息.
我已经开始查看我怀疑的每个TOM.NET对象,并预先加载我在稍后从Session中加载对象时可能需要的大量数据.
我还想根据以前的经验添加评论.以下场景:
可能导致前面描述的几个问题,包括发布期间的内存泄漏.
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)
可以节省很多问题
归档时间: |
|
查看次数: |
304 次 |
最近记录: |