1

我们正在尝试让连接池与 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 例程,然后在 Page_Unload()/Page_Error() 中对会话调用 close。

关于我们做错了什么的任何想法?我们预计连接池会提高性能,如果池已满,则回退到标准机制,但是非池化版本可以很好地处理 20 个同时请求,池化版本经常失败。我们在应用程序的 web.config 中设置了连接池,将 MinPoolSize 设置为 1,将 MaxPoolSize 设置为 10,其他一切都保持默认值。

4

1 回答 1

1

这是由于缺乏 UniVerse 许可证。我们以为我们有 10 个,但实际上我们只有 1 个。调用连接池代码要求比我们有权获得更多的许可证会引发错误,但只有在连接尝试超时之后。

只是为了混淆问题,使用 UniVerse 10.1 存在一个错误,这意味着您可以拥有任意数量的连接,只是最近升级到 10.3 才强制限制您拥有的许可证数量。

于 2011-03-28T16:13:54.323 回答