0

其實我試圖在我們的頁面上實現Google標記,以便我們的用戶控件將在頁面標題部分服務器性能下降,而我們試圖從Tridion 2009經紀人獲取一些數據使用C#2.0的LINK_INFO表使用C#2.0

以下呈現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「/ae/english/index.aspx,/au/english/index.aspx等」從經紀人LINK_INFO表的這個部分,這個實施工作得很好,直到我們去LIVE網站與LIVE經紀人數據庫,當我們在LIVE上啓用此功能時,我們的服務器性能因代理數據庫命中而被殺害,並且由於我們的網站每天有150萬次點擊,似乎鎖定LINK_INFO表,因此上述功能的工作方式類似於如下:

  1. 每當任何網站頁面加載它調用我們的代理和代理調用我們的互聯網服務和Web服務調用我們的SQL程序都到LINK_INFO表,並拿出結果的列表PAGEID的基礎上傳遞到SQL過程。
  2. SQL Procedure返回的xml結果然後傳遞給我的控件,我的XSLT使用它並呈現出完整的HTML。

看來出現了一些問題,請大家建議是否可以通過其他方式實現上述功能,而無需觸摸代理數據庫。編寫頁面事件或定製部署者會有所幫助?

請建議!!

注:我們正在使用外表套上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 
+0

有沒有理由用SQL查詢Broker數據庫,而不是使用可緩存的鏈接API? –

+0

嗨克里斯感謝您的回覆,實際上我們將爲每個頁面提供不同的數據,並且我們向代理傳遞pageID,並且在pageID的基礎上返回一個130行的XML(在我們的例子中),因爲我們有130 tridion的出版物。我們怎樣才能使用這個可連接的cpi的API ..請建議 –

+0

這個問題的原因爲什麼等級minus –

回答

2

我希望你在你的實現中有一些標準的代碼,你可以搜索一些適當的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"/> 

獲取你的手放在一些特里東文檔儘快。與Tridion合作時,這是必須的!

祝你好運!


編輯:

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

這將:這應該能夠寫出你的谷歌標記多語種鏈接的頭部時,調用中的PageId(不含中醫)的方法id一個未經測試的代碼示例要求您將出版物和屬於每個出版物的文化字符串存儲在web.config中。當然,您也可以將其存儲在其他地方,但這對於網絡服務器來說似乎是最快和最不緊張的。當然,正確的緩存需要到位。

這將避免您必須編寫自定義的部署腳本或其他複雜的非標準Tridion方法。

+0

嗨Hendrik ..感謝,我很清楚Tridion Linking API,我的問題是,這是否會幫助我實現上述目標,因爲我當前的實現將pageid(中心部分)傳遞給我的GoogleSEO數據庫,並將結果發回給我進一步傳遞給我的XSLT,它呈現在HTML之上。現在我無法理解如何使用Tridion Linking API獲取此數據...請在此建議..謝謝 –

+0

我用PageLink示例更新了答案。 –

+0

我打算自定義部署者,請在Fran的回答中查看我的評論,如果能夠爲此實施提供一些啓示,我將不勝感激。 –

2

查詢直接不支持數據庫,可能會使您的支持合同 - 很明顯 - 繞開Tridion Cache的使用(可能部分解釋您的性能問題)。建議:使用Tridion LINKING API來實現您的目標。

+0

謝謝..這只是爲了測試..現在我們已經將這些數據移動到單獨的數據庫和表。任何起點我們如何在這裏使用Tridion Linking API而不是數據庫使用 –

+0

http://sdllivecontent.sdl。com/LiveContent/content/zh-CN/SDL_Tridion_2011_SPONE/dlidheading-258866368 –

+0

@ frank-van-puffelen,我們仍在使用Tridion 2009,以上鍊接的用戶名和密碼是什麼。 –

2

每當你碰到數據庫性能問題,有可以提供快速的救濟兩種方法:

  1. 添加額外的索引到了在(排序和過濾)的查詢
  2. 緩存使用的列在一定的時間內進行的昂貴查詢的結果

在這種情況下,我一定會查看索引,因爲它聽起來像您可能會在實時數據庫中缺少一些必需的XML索引。如果您對數據庫操作不太熟練,還可以考慮將您生成的HTML片段保留在靜態變量中,並將其用於後續請求。即使你只是這樣做了5分鐘,你最終會減少因數據庫的命中率。


我想現在已經足夠讓家庭使用Tridion數據庫的警告了。從長遠來看,您應該尋找一種通過Tridion Content Delivery API獲取相同信息的方法。我很確定這裏也提供了相同的信息,儘管我不完全確定你是否也可以像在這裏一樣迅速地得到結果列表。

即使您可能最終遇到類似的性能問題,如果您使用該路線,您至少會回到支持的Tridion域。這意味着更多Tridion社區成員可以幫助您。

一旦您切換到使用Tridion API,緩存也肯定會成爲減少性能問題的一個選項。另一種方法是確實可以將語言/ URL列表保存爲磁盤上的單獨文件,並在每次部署相關內容時進行更新。對Tridion部署者的擴展將是這樣做的合理地點。如果您在谷歌搜索「Tridion部署者擴展」,我相當肯定會有一些好的結果出現。

+0

謝謝弗蘭克,我得到了這個(http://www.sdltridionworld 。com/articles/sdltridion2011/tutorials/Deployer_Extensions_With_Eclipse_1.aspx),現在想到了一些問題,在我們進行部署者擴展之前,發佈速度會很慢,因爲我的擴展將適用於每個頁面發佈或取消發佈,並且會刪除xml當發佈完成並創建一個新的xml發佈完成後,現在當用戶在網站上查看該頁面,並在該編輯器發佈相同的頁面,那麼這將給鎖定和部署者將無法創建xml的異常...什麼做你建議在這個 –

+0

弗蘭克,我打算定製部署者將被定製的PageDeploy和UnDeploy模塊,一個問題點擊關於鎖定問題,因爲每當一個頁面發佈時,我的部署者將在服務器上創建一個類似於這個名稱123456的xml。這個頁面的xml,它會存儲像這個特定頁面的這樣的節點,並且如果從其他語言發佈了相同的頁面,它將會去檢查在頁面xml存在,如果存在將打開它並再次追加節點,我的問題是,如何避免在這裏鎖定! –

+0

由於它是您寫入文件的擴展名,因此我還認爲這是您的擴展程序,可以鎖定它們。查看你的代碼,看看你是否關閉了你打開的所有流。 –

相關問題