Почему Uodotnet с тайм-аутом пула подключений? - PullRequest
1 голос
/ 28 марта 2011

Мы пытаемся заставить пул соединений работать с uodotnet и в настоящий момент терпеть неудачу. Когда мы отключаем пул соединений, все работает как положено, но когда мы его включаем, мы часто получаем тайм-ауты или ошибки с одним из следующих выходов трассировки:

2011-03-28T15:09:28 System.Exception: Non-negative number required.
Parameter name: millisecondsTimeout Source: UniObjects Class Method: Boolean ObjWait(Boolean, Int32, System.Object)   at System.Threading.Monitor.ObjWait(Boolean exitContext, Int32 millisecondsTimeout, Object obj)
   at System.Threading.Monitor.Wait(Object obj, Int32 millisecondsTimeout, Boolean exitContext)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniObjects.OpenSession(String hostname, Int32 port_number, String userid, String password, String account, String service, Int32 min_poolsize, Int32 max_poolsize)
   at OurNamespace.UniversePage.OpenSession()
   at OurNamespace.UniversePage.Page_Init(Object sender, EventArgs e)
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnInit(EventArgs e)
   at System.Web.UI.Page.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Или:

2011-03-28T15:09:32 System.Exception: [IBM U2][UODOTNET - UNICLIENT][ErrorCode=81015] The connection has timed out Source: UniObjects Class Method: IBMU2.UODOTNET.UniSession FindSession(Int32)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniPool.FindSession(Int32 pTimeout)
   at IBMU2.UODOTNET.UniObjects.OpenSession(String hostname, Int32 port_number, String userid, String password, String account, String service, Int32 min_poolsize, Int32 max_poolsize)
   at OurNamespace.UniversePage.OpenSession()
   at OurNamespace.UniversePage.Page_Init(Object sender, EventArgs e)
   at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
   at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
   at System.Web.UI.Control.OnInit(EventArgs e)
   at System.Web.UI.Page.OnInit(EventArgs e)
   at System.Web.UI.Control.InitRecursive(Control namingContainer)
   at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Не все запросы терпят неудачу (например, при запуске через инструмент нагрузочного тестирования 7/20 запросов не выполняются с проблемой тайм-аута).

Кажется, что сеансы остаются в пуле, и новые попытки создать сеанс повторяются до тех пор, пока не будет достигнут предел времени ожидания (30 секунд). Мы используем uodotnet.dll версии 2.1.1.7196 и UniVerse версии 10.3. работает на сервере HP-UX. У нас есть одна лицензия на машину для тестирования, на которой мы тестируем 10 подключений в пуле (теоретически!). Мы пишем веб-сайт ASP.Net и создаем новый сеанс в событии Page_Load (), который передается всем подпрограммам UniVerse, а затем вызываем close для сеанса в Page_Unload () / Page_Error ().

Есть идеи, что мы делаем не так? Мы ожидали, что пул соединений улучшит производительность, прибегая к стандартному механизму, если пул будет заполнен, но, хотя версия без пула отлично работает с 20 одновременными запросами, версия с пулами регулярно дает сбой. Мы установили пул соединений в файле web.config приложения, установив MinPoolSize в 1 и MaxPoolSize в 10, оставив все остальное по умолчанию.

1 Ответ

1 голос
/ 28 марта 2011

Это было связано с отсутствием лицензий UniVerse.Мы думали, что у нас было 10, но на самом деле у нас было только 1. Вызов кода пула соединений, запрашивающий больше лицензий, чем мы имеем право выдать ошибку, но только после истечения времени ожидания попытки подключения.

ПростоЧтобы запутать ситуацию, при использовании UniVerse 10.1 была ошибка, из-за которой у вас могло быть столько соединений, сколько вам нужно, это было только недавнее обновление до 10.3, которое установило ограничение на количество принадлежащих вам лицензий.

...