0

実際、私はページにGoogleマークアップを実装しようとしました。これにより、ユーザーコントロールはページヘッダーセクションで以下のタイプのHTMLをレンダリングします。

<link rel="alternate" hreflang="en-GB" href="http://www.mysite.com/english/index.aspx" />

<link rel="alternate" hreflang="de-DE" href="http://www.mysite.com/de/german/index.aspx" />

<link rel="alternate" hreflang="en-DE" href="http://www.mysite.com/de/english/index.aspx" />

<link rel="alternate" hreflang="ru-RU" href="http://www.mysite.com/ru/russian/index.aspx" />

<link rel="alternate" hreflang="en-RU" href="http://www.mysite.com/ru/english/index.aspx" />

<link rel="alternate" hreflang="fr-FR" href="http://www.mysite.com/fr/french/index.aspx" />

<link rel="alternate" hreflang="it-IT" href="http://www.mysite.com/it/italian/index.aspx" />

<link rel="alternate" hreflang="ja-JP" href="http://www.mysite.com/jp/japanese/index.aspx" />

<link rel="alternate" hreflang="ko-KR" href="http://www.mysite.com/kr/korean/index.aspx" />

<link rel="alternate" hreflang="pt-BR" href="http://www.mysite.com/br/portuguese/index.aspx" />

<link rel="alternate" hreflang="zh-Hans-CN" href="http://www.mysite.com/cn/chinese/index.aspx" />

<link rel="alternate" hreflang="en-US" href="http://www.mysite.com/us/english/index.aspx" />

<link rel="alternate" hreflang="en-GB" href="http://www.mysite.com/uk/english/index.aspx" />

<link rel="alternate" hreflang="en-AU" href="http://www.mysite.com/au/english/index.aspx" />

<link rel="alternate" hreflang="en-AE" href="http://www.mysite.com/ae/english/index.aspx" />

上記のhtmlでは、ブローカーLINK_INFOテーブルからHTMLのこの部分「/ae/english/index.aspx、/au/english/index.aspxなど」を見つけることができます。この実装は、LIVEブローカーデータベースを使用してLIVE Webサイトにアクセスするまで、正常に機能しました。 LIVEでこの機能を有効にすると、ブローカーデータベースのヒットが原因でサーバーのパフォーマンスが低下し、ウェブサイトの1日あたりのヒット数が150万であるため、LINK_INFOテーブルがロックされているようです。上記の機能は次のように機能します。

  1. Webサイトのページが読み込まれるたびに、プロキシが呼び出され、プロキシがWebサービスを呼び出し、WebサービスがSQLプロシージャを呼び出します。SQLプロシージャはLINK_INFOテーブルに移動し、SQLプロシージャに渡されたPageIDに基づいて結果のリストを取得します。
  2. 次に、SQLプロシージャが返されたxmlの結果がコントロールに渡され、XSLTがそれを使用して、完全なHTMLの上にレンダリングされます。

何かがおかしいようです。ブローカーデータベースに触れることなく、上記の機能を実現する他の方法がある可能性があることを提案してください。ページEVENTを作成するか、Deployerをカスタマイズすると役立ちますか?

提案してください!!

注:Tridion2009を使用しています

編集:ブローカーSQLの手順は次のとおりです。

ALTER PROCEDURE [dbo].[GETDataFromLinkInfo] 
-- Add the parameters for the stored procedure here 
(@PageID INT) 
AS 
  BEGIN 
      -- SET NOCOUNT ON added to prevent extra result sets from 
      -- interfering with SELECT statements. 
      SET NOCOUNT ON; 

      -- Insert statements for procedure here 
      SELECT DISTINCT [PUBLICATION_ID] AS n, 
                      [URL]            AS u 
      FROM   [LINK_INFO] WITH(NOLOCK) 
      WHERE  Page_ID = @PageID 
             AND Component_Template_Priority > 0 
             AND PUBLICATION_ID NOT IN( 232, 481 ) 
      ORDER  BY URL 
      FOR XML RAW ('p'), ROOT ('ps'); 

      RETURN 
  END
4

3 に答える 3

2

データベースのパフォーマンスの問題が発生した場合は常に、迅速な救済を提供できる2つのアプローチがあります。

  1. クエリ(の並べ替えとフィルタリング)で使用される列にインデックスを追加します
  2. 高価なクエリの結果を一定時間キャッシュする

この場合、ライブデータベースで必要なXMLインデックスが欠落している可能性があるため、インデックスを確認します。データベース操作にあまり精通していない場合は、生成したHTMLフラグメントを静的変数に保持し、それを後続のリクエストで再利用することも検討してください。これをたとえば5分間行ったとしても、データベースへのヒットを要因によって減らすことになります。


Tridionデータベースに対してSQLを使用することについての警告は、今では十分に理解されていると思います。長期的には、Tridion ContentDeliveryAPIを介して同じ情報を取得する方法を確実に探す必要があります。ここでも同じ情報がすぐに利用できると確信していますが、ここで行うのと同じくらい迅速に結果をリストとして取得できるかどうかは完全にはわかりません。

そのルートに行くと同様のパフォーマンスの問題が発生する可能性がありますが、少なくともサポートされているTridionドメインに戻ることになります。これは、より多くのTridionコミュニティメンバーがあなたを助けることができるかもしれないことを意味します。

Tridion APIの使用に切り替えると、キャッシングはパフォーマンスの問題を減らすためのオプションにもなります。別の方法として、言語/ URLのリストをディスク上の個別のファイルとして保持し、関連するものがデプロイされるたびにそれを更新することもできます。Tridionデプロイヤの拡張機能は、これを行うための論理的な場所です。「Tridiondeployerextension」をグーグルで検索すると、良い結果が出ると確信しています。

于 2012-05-20T22:36:11.097 に答える
2

データベースへの直接クエリはサポートされておらず、サポートコントラクトが無効になる可能性があり、明らかに、Tridion Cacheの使用を回避する可能性があります(パフォーマンスの問題を部分的に説明する可能性があります)。提案:達成しようとしていることには、TridionLINKINGAPIを使用してください。

于 2012-05-20T16:59:15.713 に答える
2

実装にいくつかの標準コードが含まれていることを願っています。これにより、適切なTridionAPIリンクを検索できる可能性があります。明らかに、すでに述べたように、Tridion Brokerに直接クエリを実行することはサポートされていませんが、このTridonコアリンク機能には意味がありません。

とにかく、次のようなコードを探してください。

<tridion:ComponentLink runat="server" PageURI='tcm:12-1234-64'
                TemplateURI="tcm:0-0-0" ComponentURI="tcm:12-1233"
                LinkText="proper Tridion Linking in .NET" TextOnFail="true"/>

Tridonのドキュメントをできるだけ早く入手してください。Tridionを使用する場合、これは必須です。

幸運を!


編集:メソッドIDがpageID(TCMなし)で呼び出されたときに、ヘッドにGoogle Markup MultiLingualリンクを書き出すことができるはずのテストされていないコードサンプル:

using System;
using Tridion.ContentManager;
using Tridion.ContentManager.CommunicationManagement;
using Tridion.ContentManager.ContentManagement;
using Tridion.ContentManager.Templating;

namespace Website.TridionTBBs.Utilities
{
    /// <summary>
    /// Class exposing utility methods for frequent Tridion item methods.
    /// </summary>
    public static class TridionCustomUtilities
    {
        #region Constants

        public const string PageLinkGoogleMarkup = "<link rel=\"alternate\" hreflang=\"{0}\" href=\"{1}\" />\r\n";

        #endregion

        #region PageLinks
        /// <summary>
        /// This method will return the MultiLingual Google Markup link
        /// Relies on two important Webconfig entries where the publication and culture information is located
        /// <add key="publications" value="26,27,28,29,30,31,32,33,34" />
        /// <add key="tcm:0-26-1" value="en-GB" />
        /// <add key="tcm:0-27-1" value="de-DE" />
        /// etc...
        /// </summary>
        /// <param name="pageID">The PageId is provided from the page</param>
        static void GoogleMarkupPageLink(int pageID)
        {

            string[] publicationIDs = ConfigurationManager.AppSettings["publications"].Split(',');

            StringWriter s = new StringWriter();

            using (PageLink pageLink = new PageLink())
            {
                for (int i = 0; i < publicationIDs.Count; i++)
                {
                    Link link = pageLink.GetLink(String.Format("tcm:{0}-{1}", publicationIDs[i], pageID.ToString()));

                    if (link != null && link.IsResolved)
                    {
                        string linkUrl = link.Url;

                    }
                    string culture = ConfigurationManager.AppSettings[String.Format("tcm:0-{0}-1", publicationIDs[i])];

                    Response.Write(String.Format(PageLinkGoogleMarkup, culture, linkUrl));
                }
            }
        }
        #endregion
    }
}

これには、パブリケーションと各パブリケーションに属するカルチャ文字列をweb.configに保存する必要があります。もちろん、これを別の場所に保存することもできますが、これはWebサーバーにとって最も速くてストレスが少ないように思われます。もちろん、適切なキャッシュを設定する必要があります。

これにより、カスタムデプロイスクリプトやその他の複雑な非標準のTridionメソッドを作成する必要がなくなります。

于 2012-05-20T21:42:15.667 に答える