Производительность сервера снижается, пока мы пытаемся получить некоторые данные из таблицы LINK_INFO брокера Tridion 2009 с использованием C# 2.0

На самом деле я попытался внедрить Google Markup на наших страницах, чтобы наш пользовательский контроль отображал 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 и т. Д." Из таблицы Broker LINK_INFO, эта реализация работала нормально, пока мы не перешли на веб-сайт LIVE с базой данных LIVE-брокера, и Когда мы включаем эту функцию в LIVE, производительность нашего сервера снижается из-за попаданий в базу данных брокера, и кажется, что блокировка таблицы LINK_INFO, поскольку наш веб-сайт получает 1,5 миллиона посещений в день, вышеупомянутая функциональность работает, как показано ниже:

  1. Всякий раз, когда загружается какая-либо страница веб-сайта, она вызывает наш прокси, а прокси-сервер вызывает наш веб-сервис, а веб-сервис вызывает нашу процедуру SQL, которая переходит в таблицу LINK_INFO и извлекает список результатов на основе PageID, переданного в процедуру SQL.
  2. Процедура SQL вернула результат xml, затем передается моему контролю, где мой XSLT использует его, и выводится поверх полного HTML.

Кажется, что-то идет не так, пожалуйста, предположите, что может быть другой путь для достижения вышеупомянутой функциональности, не затрагивая базу данных брокера. Написание страницы 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

3 ответа

Решение

Я надеюсь, что у вас есть некоторый стандартный код в вашей реализации, который вы могли бы найти для правильной привязки 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!

Удачи!


РЕДАКТИРОВАТЬ: пример непроверенного кода, который должен быть в состоянии записать вашу многоязычную ссылку Google Markup в заголовке, когда идентификатор метода вызывается с идентификатором страницы (без 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. Конечно, вы можете хранить это и где-то еще, но это может показаться самым быстрым и наименее напряженным для веб-серверов. Конечно, правильное кэширование должно быть на месте.

Это позволит вам избежать написания пользовательских сценариев развертывания или других сложных нестандартных методов Tridion.

Непосредственный запрос к базе данных НЕ поддерживается, может сделать недействительным ваш контракт на поддержку и - очевидно - обойдет использование Tridion Cache (что может частично объяснить ваши проблемы с производительностью). Предложение. Используйте API Tridion LINKING для достижения ваших целей.

Всякий раз, когда вы сталкиваетесь с проблемами производительности базы данных, есть два подхода, которые могут обеспечить быстрое облегчение:

  1. Добавьте дополнительные индексы к столбцам, которые используются (сортировка и фильтрация) ваших запросов
  2. Кэшировать результаты дорогих запросов на определенное время

В этом случае я бы определенно посмотрел на индексы, так как может показаться, что вам не хватает некоторых необходимых XML-индексов в вашей действующей базе данных. Если вы не очень хорошо разбираетесь в операциях с базой данных, также подумайте о том, чтобы просто сохранить созданный вами фрагмент HTML в статической переменной и повторно использовать его для последующих запросов. Даже если вы просто сделаете это, скажем, в течение 5 минут, вы в конечном итоге сократите количество попаданий в базу данных по факторам.


Я думаю, что предупреждение об использовании SQL в базе данных Tridion уже достаточно распространено. В долгосрочной перспективе вам обязательно нужно найти способ получить ту же информацию через API доставки контента Tridion. Я вполне уверен, что та же информация доступна и там, хотя я не совсем уверен, сможете ли вы получить результаты в виде списка так же быстро, как вы можете сделать это здесь.

Даже если вы пойдете по этому пути с похожими проблемами с производительностью, вы по крайней мере вернетесь в поддерживаемый домен Tridion. Это означает, что больше членов сообщества Tridion смогут вам помочь.

Кэширование, безусловно, также позволит уменьшить проблемы с производительностью после перехода на использование Tridion API. В качестве альтернативы вы могли бы действительно сохранить список языков /URL-адресов в виде отдельного файла на диске и обновлять его каждый раз, когда что-то релевантное развертывается. Расширение для развертывателя Tridion было бы логичным местом для этого. Если вы выполните поиск в Google по запросу "Расширение Tridion для развертывания", я уверен, что найдутся хорошие результаты.

Другие вопросы по тегам