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 中,您可以从 Broker LINK_INFO 表中找到 HTML“/ae/english/index.aspx、/au/english/index.aspx 等”的这一部分,这个实现工作正常,直到我们使用 LIVE 代理数据库进入 LIVE 网站,并且当我们在 LIVE 上启用此功能时,我们的服务器性能由于代理数据库的点击而被杀死,并且似乎锁定了 LINK_INFO 表,因为我们的网站每天有 150 万次点击,上述功能的工作原理如下:

  1. 每当加载任何网站页面时,它都会调用我们的代理,代理调用我们的 Web 服务,Web 服务调用我们的 SQL 过程,该过程会转到 LINK_INFO 表并根据传递给 SQL 过程的 PageID 取出结果列表。
  2. SQL 过程返回的 xml 结果然后被传递给我的 XSLT 使用它的控件,并在完整的 HTML 之上呈现出来。

似乎出了点问题,请建议是否有其他方法可以在不接触代理数据库的情况下实现上述功能。编写 Page EVENT 或自定义 Deployer 会有所帮助吗?

请推荐!!

注意:我们使用的是 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
4

3 回答 3

2

不支持直接查询数据库,这可能会使您的支持合同无效,并且 - 显然 - 规避了 Tridion Cache 的使用(这可能部分解释了您的性能问题)。建议:使用 Tridion LINKING API 来实现您想要实现的目标。

于 2012-05-20T16:59:15.713 回答
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"/>

尽快获取一些 Tridon 文档。与 Tridion 合作时,这是必须的!

祝你好运!


编辑:一个未经测试的代码示例,当使用 pageID(没有 TCM)调用方法 id 时,它应该能够在头部写出您的 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 中存储属于每个出版物的出版物和文化字符串。当然,您也可以将其存储在其他地方,但这似乎是网络服务器最快且压力最小的。当然,适当的缓存需要到位。

这将避免您必须编写自定义部署脚本或其他复杂的非标准 Tridion 方法。

于 2012-05-20T21:42:15.667 回答
2

每当您遇到数据库性能问题时,有两种方法可以快速解决问题:

  1. 在查询(排序和过滤)中使用的列上添加附加索引
  2. 将昂贵查询的结果缓存一段时间

在这种情况下,我肯定会查看索引,因为听起来您可能在实时数据库中缺少一些必要的 XML 索引。如果您对数据库操作不是很熟练,还可以考虑将生成的 HTML 片段保留在静态变量中,并将其重新用于后续请求。即使您只是这样做 5 分钟,您最终也会按因素减少对数据库的命中。


我认为关于对 Tridion 数据库使用 SQL 的警告现在已经足够了。从长远来看,您绝对应该寻找一种通过 Tridion Content Delivery API 获取相同信息的方法。我很确定在那里也可以轻松获得相同的信息,尽管我不完全确定您是否也可以像在这里一样快速地获得结果作为列表。

即使您走这条路可能会遇到类似的性能问题,但您至少会回到受支持的 Tridion 域。这意味着更多的 Tridion 社区成员可以帮助您。

一旦切换到使用 Tridion API,缓存肯定也是减少性能问题的一种选择。或者,您确实可以将语言/URL 列表作为单独的文件保存在磁盘上,并在每次部署相关内容时进行更新。Tridion 部署程序的扩展将是执行此操作的合乎逻辑的地方。如果您在 Google 上搜索“Tridion 部署程序扩展”,我很确定会出现一些好的结果。

于 2012-05-20T22:36:11.097 回答