8

Tridionコンテンツ管理サーバーのイベントログを調べると(2009リリースを使用しています)、次のような警告が表示されます。

Session is used on another thread... than it was created on ... 
Session objects are not thread safe.

どのようなプログラミング/テンプレートの実践がこれを引き起こす可能性がありますか?

編集:これまでにいくつかの良い提案がありました:

  1. セッションオブジェクトを静的変数に格納しないでください(Chris)
  2. エンジンまたはパッケージを静的変数に保存しないでください(Miguel)

実際、これらは両方とも純金であり、これらのアンチパターンについて独自のコードを確認する必要があります。(エンジンにはセッションへの参照があるので、それは理にかなっています。)それでも、問題の原因となっているコードベースを検索しましたが、これらは見つかりませんでした。だから-誰かがこれ以上のアイデアを持っていますか?また、この種のデバッグ方法や、問題のあるコードを絞り込む方法についての提案も歓迎します。

4

4 に答える 4

9

この問題は、セッションを保存するときだけでなく、TOM.NETオブジェクト(ComponentPageなど)を保存するときにも発生します。このような各オブジェクトには、オブジェクトへのアクセスから作成されたセッションへの内部参照があり、Tridionから要求された情報を取得するためにセッションに戻る必要がある場合があります。

アイテムタイプに「ネイティブ」であるほとんどのプロパティは、インスタンスで取得および保持されているように見えますが、のような呼び出しはLoadApplicationData、要求されたデータにアクセスするためにセッションに戻る可能性があります(しなければなりません)。そして、この呼び出しが別のスレッドで発生した場合は、言及した警告メッセージが表示されます。

私は疑いを持って保持しているすべてのTOM.NETオブジェクトを調べ始め、後でそのセッションからオブジェクトを最初にロードするときに必要になる可能性のある多くのデータをプリロードしました。

于 2012-05-07T21:08:33.963 に答える
8

また、これまでの経験に基づいたコメントを追加したいと思います。次のシナリオ:

  • セッションおよび/またはエンジンおよび/またはパッケージは静的変数に保存されます
  • セッションおよび/またはエンジンおよび/またはパッケージは、静的なメソッドにパラメーターとして送信されます

公開中のメモリリークなど、前述の問題とは別にいくつかの問題が発生する可能性があります。

パブリッシャーは、応答しないモード(停止、再起動、無効化はできません)になり、サーバーを再起動する必要があるまで、メモリの消費を開始します。

大規模な公開を行うと、これらの問題は悪化する可能性があります

したがって、セッション、エンジン、パッケージを使用するものはすべて非静的に変換することをお勧めします

例として、すべてのテンプレートで使用されるユーティリティの初期化に使用される次のコードから移動します

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;
        }
    }
}

の中へ

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;
        }
    }
}

多くの問題を保存できます

于 2012-04-19T18:27:11.057 に答える
6

テンプレートの静的変数にセッションオブジェクトを格納すると、このエラーが発生することがわかりました。デバッグモードでは正常に動作しますが、マルチスレッドパブリッシャー(つまり、複数のレンダリングスレッド)を実行するとすぐに、この問題により醜い頭が発生します。

于 2012-04-18T16:46:18.330 に答える
0

別のシナリオは、イベントシステム、テンプレート、またはワークフローコードが子スレッドを開始し、適切なロックを設定せずにセッションオブジェクトまたはエンジンオブジェクトをそれらに渡す場合です。

基本的に、エンジンオブジェクトとセッションオブジェクトが基づいているシングルスレッドアパートモデルの範囲外のすべてのもの:http: //msdn.microsoft.com/en-us/library/windows/desktop/ms680112(v = vs.85 ) .aspx

于 2012-10-18T03:21:47.317 に答える