Производительность сервера снижается, пока мы пытаемся получить некоторые данные из таблицы 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 миллиона посещений в день, вышеупомянутая функциональность работает, как показано ниже:
- Всякий раз, когда загружается какая-либо страница веб-сайта, она вызывает наш прокси, а прокси-сервер вызывает наш веб-сервис, а веб-сервис вызывает нашу процедуру SQL, которая переходит в таблицу LINK_INFO и извлекает список результатов на основе PageID, переданного в процедуру SQL.
- Процедура 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 для достижения ваших целей.
Всякий раз, когда вы сталкиваетесь с проблемами производительности базы данных, есть два подхода, которые могут обеспечить быстрое облегчение:
- Добавьте дополнительные индексы к столбцам, которые используются (сортировка и фильтрация) ваших запросов
- Кэшировать результаты дорогих запросов на определенное время
В этом случае я бы определенно посмотрел на индексы, так как может показаться, что вам не хватает некоторых необходимых XML-индексов в вашей действующей базе данных. Если вы не очень хорошо разбираетесь в операциях с базой данных, также подумайте о том, чтобы просто сохранить созданный вами фрагмент HTML в статической переменной и повторно использовать его для последующих запросов. Даже если вы просто сделаете это, скажем, в течение 5 минут, вы в конечном итоге сократите количество попаданий в базу данных по факторам.
Я думаю, что предупреждение об использовании SQL в базе данных Tridion уже достаточно распространено. В долгосрочной перспективе вам обязательно нужно найти способ получить ту же информацию через API доставки контента Tridion. Я вполне уверен, что та же информация доступна и там, хотя я не совсем уверен, сможете ли вы получить результаты в виде списка так же быстро, как вы можете сделать это здесь.
Даже если вы пойдете по этому пути с похожими проблемами с производительностью, вы по крайней мере вернетесь в поддерживаемый домен Tridion. Это означает, что больше членов сообщества Tridion смогут вам помочь.
Кэширование, безусловно, также позволит уменьшить проблемы с производительностью после перехода на использование Tridion API. В качестве альтернативы вы могли бы действительно сохранить список языков /URL-адресов в виде отдельного файла на диске и обновлять его каждый раз, когда что-то релевантное развертывается. Расширение для развертывателя Tridion было бы логичным местом для этого. Если вы выполните поиск в Google по запросу "Расширение Tridion для развертывания", я уверен, что найдутся хорошие результаты.