C#2.0を使用してTridion 2009 Broker Link_Infoテーブルからいくつかのデータを取得しようとしている間に停止しているサーバーのパフォーマンス
-
12-12-2019 - |
質問
実際に私はページに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では、HTMLのこの部分をBroker Link_infoテーブルから/エンジン/インデックス.aspxなどのこの部分を見つけることができます。データベース、およびライブでこの機能を有効にすると、ブローカーデータベースのヒットのためにヒットが強制終了し、Link_infoテーブルのロックされているように見え、私たちのWebサイトは1日のヒットに150万を得たようです、上記の機能は以下のように機能します。
- 任意のWebサイトページがロードされるたびに、プロキシとプロキシ呼び出しを呼び出し、WebServiceとWebServiceはLink_infoテーブルに移動するSQLプロシージャを呼び出し、SQLプロシージャに渡されたPageIdに基づいて結果のリストを取り出します。
- SQLプロシージャー返されたXML結果が私のコントロールに渡され、私のXSLTがそれを使用し、フルHTMLの上で上にレンダリングします。
何かが間違っているようです、提案してください。ブローカーデータベースに触れることなくこの上記の機能を実現するための他の方法があることをお勧めします。ページイベントまたはデプロイヤのカスタマイズを書くことは役に立ちますか?
お勧めしてください!!
注:Tridion 2009を使用しています
編集:ブローカ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
解決
私はあなたがあなたの実装にいくつかの標準コードを持っていることを願っています、あなたはいくつかの適切なTridion APIリンクを検索することができるかもしれません。明らかに、前に述べられているように、Tridion Brokerを直接問い合わせることはサポートされていませんが、このTridon Core Linking機能も意味がありません。
とにかく、このようなコードを探す:
<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"/>
.
ASAPをASAPにするトライドンのドキュメントで手を取得します。それはTridionと一緒に働くときに必須です!
頑張って!
編集:メソッドIDがPageIDで呼び出されたときにGoogleマークアップの多言語リンクを書くことができる場合は、(TCMなし)を書くことができる場合は、テストされていないコードサンプルを参照してください。
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サーバーにとって最も迅速かつ最低ストレスがあるようです。もちろん、適切なキャッシングが整っている必要があります。
これはあなたがカスタム展開スクリプトやその他の複雑な非標準のトリジオンメソッドを書く必要があります。
他のヒント
データベースを直接照会することはサポートされておらず、あなたのサポート契約を無効にすることができ、そして明らかに - あなたのパフォーマンスの問題を部分的に説明するかもしれません)。提案:あなたが達成しようとしているもののためにAPIをリンクするTridionを使用してください。
データベースのパフォーマンスの問題に遭遇するたびに、迅速な救済を提供できる2つのアプローチがあります。
- クエリの(ソートとフィルタリング)で使用されている列に追加のインデックスを追加します。
- 高価なクエリの結果を一定時間キャッシュする
この場合は、ライブデータベース上に必要なXMLインデックスがいくつか存在する可能性があるように聞こえるので、索引を見てください。データベース操作であまり堪能でない場合は、静的変数で生成したHTMLフラグメントを保持し、後続のリクエストのために再使用するだけです。 5分ごとにこれを行っても、データベース上のヒットが要因によって減少します。
Tridionデータベースに対してSQLを使用することについての警告は、今十分に家に運転されています。長期的には、Tridion Content Delivery APIを介して同じ情報を取得する方法を間違いなく探してください。私も同じ情報がそこに入手可能であることは非常に確信していますが、あなたがここでできる限りすぐに結果を早くリストとして取得することができるかどうかは完全には確かではありません。
そのルートに行った場合は、同様のパフォーマンスの問題に終了することがありますが、少なくともサポートされているTridionドメインに戻ってください。これは、より多くのトリジオンコミュニティメンバーがあなたを助けることができるかもしれないことを意味します。
キャッシングは間違いなくTridion APIの使用に切り替えたら、パフォーマンスの問題を低減するためのオプションでもあります。代替手段は、言語/ URLのリストをディスク上の別のファイルとして保持し、関連するものが展開されるたびに更新されます。 Tridion Deployerへの拡張機能はこれを行うための論理的な場所になります。 「Tridion Deployer Extension」のGoogle検索を行う場合は、いくつかの良い結果が表示されます。