我有一个VB.NET应用程序在我的开发机器上工作正常,但在我的服务器上产生间歇性错误。事件日志在下面(对不起,如果这比需要发布的更多,但我的一个问题是解释事件日志)。
当两个或更多人同时运行Web应用程序时,服务器上似乎发生错误。通常它看起来像是挂起然后超时。然后,如果我尝试返回运行应用程序,我会收到以下错误,直到我重新启动服务器上的网站。到目前为止,如果只有一个人在运行该应用程序,则没有问题。我的服务器供应商表明这表明它是应用程序错误(而不是内存,服务器等)。该应用程序抓取输入数据,查询多个MS Access数据库(使用ADODB)并通过AJAX返回一些值。这是一个相当密集的计算应用程序,需要几秒钟才能运行。
我知道我应该提供生成错误的代码,但我的第一个问题是我不知道如何阅读事件日志。 这告诉我错误事件发生在哪里?我认为它与点击数据库有关?
目前,它只是读取数据,所以我假设不能以某种方式锁定数据库?我不相信我打开了多个连接或打开了多个记录集,并且我打开/关闭每个数据库查询(同样,它在开发机器上工作)。所以看起来它必须与多个用户有关?
一般来说,我认为我不需要担心人们同时点击数据库或应用程序?或者这是预期的,即我是否需要始终围绕违规代码进行Try / Catch(一旦我弄清楚哪些代码有问题)来捕获这些错误?
另外,我不知道这是正常的还是与问题有关 - 事件日志显示的路径不是来自服务器,而是来自我的开发机器(那些以C:\ MyFiles开头的路径)。 )。服务器如何知道这些路径?这是存储在上传到服务器的二进制DLL中的东西吗?
如果我错过了提供更多信息,我会再次道歉。但也许这些初步问题可以让我更接近问题的根源。这似乎是一个有用的论坛。
提前致谢, 卡盘
注意:某些IP地址已被屏蔽
Log Name: Application
Source: ASP.NET 4.0.30319.0
Date: 8/6/2013 2:48:00 PM
Event ID: 1309
Task Category: Web Event
Level: Warning
Keywords: Classic
User: N/A
Computer: 358797-web1
Description:
Event code: 3005
Event message: An unhandled exception has occurred.
Event time: 8/6/2013 2:48:00 PM
Event time (UTC): 8/6/2013 7:48:00 PM
Event ID: ca3280fb485345c194349a42e6e81a85
Event sequence: 66
Event occurrence: 11
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/12/ROOT-1-130202909916484475
Trust level: Full
Application Virtual Path: /
Application Path: C:\inetpub-illustrations\wwwroot\
Machine name: 358797-WEB1
Process information:
Process ID: 760
Process name: w3wp.exe
Account name: NT AUTHORITY\SYSTEM
Exception information:
Exception type: COMException
Exception message: Operation is not allowed when the object is open.
at ADODB.ConnectionClass.set_ConnectionString(String pbstr)
at clsCalc_IllustrationValues.mod_DLLUtilities.util_OpenMyDBConnection(String& strDBName,
String& strPassword) in C:\MyFiles\Visual Studio Projects
\clsCalc_IllustrationValues\mod_DLLUtilities.vb:line 130
at clsCalc_IllustrationValues.clsConvertedActVal.GetPlanData(Int32& eLOB_ActValCalcs,
usrUserInputType& usrUserInput, usrPolicyValuesType& usrPolicyValues) in C:\MyFiles\Visual
Studio Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2668
at clsCalc_IllustrationValues.clsConvertedActVal.TradSolve() in C:\MyFiles\Visual Studio
Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2063
at clsCalc_IllustrationValues.clsActValDotNet.DoSingleSolve(DataSet dsDataSet) in
C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues \clsActValDotNet.vb:line 945
at _Default.CallSingleSolve() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 2997
at _Default.InitializeAllControls() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line
354
at _Default.Page_Load(Object sender, EventArgs e) in C:\inetpub-
illustrations\wwwroot\Default.aspx.vb:line 65
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Request information:
Request URL: http://xx.xx.xx.250/Default.aspx
Request path: /Default.aspx
User host address: xx.xx.xx.91
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\SYSTEM
Thread information:
Thread ID: 18
Thread account name: NT AUTHORITY\SYSTEM
Is impersonating: False
Stack trace: at ADODB.ConnectionClass.set_ConnectionString(String pbstr)
at clsCalc_IllustrationValues.mod_DLLUtilities.util_OpenMyDBConnection(String& strDBName, String& strPassword) in C:\MyFiles\Visual Studio Projects \clsCalc_IllustrationValues\mod_DLLUtilities.vb:line 130
at clsCalc_IllustrationValues.clsConvertedActVal.GetPlanData(Int32& eLOB_ActValCalcs, usrUserInputType& usrUserInput, usrPolicyValuesType& usrPolicyValues) in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2668
at clsCalc_IllustrationValues.clsConvertedActVal.TradSolve() in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2063
at clsCalc_IllustrationValues.clsActValDotNet.DoSingleSolve(DataSet dsDataSet) in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues \clsActValDotNet.vb:line 945
at _Default.CallSingleSolve() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 2997
at _Default.InitializeAllControls() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 354
at _Default.Page_Load(Object sender, EventArgs e) in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 65
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Custom event details:
Event Xml:
<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
<System>
<Provider Name="ASP.NET 4.0.30319.0" />
<EventID Qualifiers="32768">1309</EventID>
<Level>3</Level>
<Task>3</Task>
<Keywords>0x80000000000000</Keywords>
<TimeCreated SystemTime="2013-08-06T19:48:00.000Z" />
<EventRecordID>30445</EventRecordID>
<Channel>Application</Channel>
<Computer>358797-web1</Computer>
<Security />
</System>
<EventData>
<Data>3005</Data>
<Data>An unhandled exception has occurred.</Data>
<Data>8/6/2013 2:48:00 PM</Data>
<Data>8/6/2013 7:48:00 PM</Data>
<Data>ca3280fb485345c194349a42e6e81a85</Data>
<Data>66</Data>
<Data>11</Data>
<Data>0</Data>
<Data>/LM/W3SVC/12/ROOT-1-130202909916484475</Data>
<Data>Full</Data>
<Data>/</Data>
<Data>C:\inetpub-illustrations\wwwroot\</Data>
<Data>358797-WEB1</Data>
<Data>
</Data>
<Data>760</Data>
<Data>w3wp.exe</Data>
<Data>NT AUTHORITY\SYSTEM</Data>
<Data>COMException</Data>
<Data>Operation is not allowed when the object is open.
at ADODB.ConnectionClass.set_ConnectionString(String pbstr)
at clsCalc_IllustrationValues.mod_DLLUtilities.util_OpenMyDBConnection(String& strDBName, String& strPassword) in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues\mod_DLLUtilities.vb:line 130
at clsCalc_IllustrationValues.clsConvertedActVal.GetPlanData(Int32& eLOB_ActValCalcs, usrUserInputType& usrUserInput, usrPolicyValuesType& usrPolicyValues) in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2668
at clsCalc_IllustrationValues.clsConvertedActVal.TradSolve() in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2063
at clsCalc_IllustrationValues.clsActValDotNet.DoSingleSolve(DataSet dsDataSet) in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues \clsActValDotNet.vb:line 945
at _Default.CallSingleSolve() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 2997
at _Default.InitializeAllControls() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 354
at _Default.Page_Load(Object sender, EventArgs e) in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 65
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
</Data>
<Data>http://xx.xx.xx.250/Default.aspx</Data>
<Data>/Default.aspx</Data>
<Data>xx.xx.xx.91</Data>
<Data>
</Data>
<Data>False</Data>
<Data>
</Data>
<Data>NT AUTHORITY\SYSTEM</Data>
<Data>18</Data>
<Data>NT AUTHORITY\SYSTEM</Data>
<Data>False</Data>
<Data> at ADODB.ConnectionClass.set_ConnectionString(String pbstr)
at clsCalc_IllustrationValues.mod_DLLUtilities.util_OpenMyDBConnection(String& strDBName, String& strPassword) in C:\MyFiles\Visual Studio
Projects\clsCalc_IllustrationValues\mod_DLLUtilities.vb:line 130
at clsCalc_IllustrationValues.clsConvertedActVal.GetPlanData(Int32& eLOB_ActValCalcs, usrUserInputType& usrUserInput, usrPolicyValuesType& usrPolicyValues) in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2668
at clsCalc_IllustrationValues.clsConvertedActVal.TradSolve() in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues\clsConvertedActVal.vb:line 2063
at clsCalc_IllustrationValues.clsActValDotNet.DoSingleSolve(DataSet dsDataSet) in C:\MyFiles\Visual Studio Projects\clsCalc_IllustrationValues \clsActValDotNet.vb:line 945
at _Default.CallSingleSolve() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 2997
at _Default.InitializeAllControls() in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 354
at _Default.Page_Load(Object sender, EventArgs e) in C:\inetpub-illustrations\wwwroot\Default.aspx.vb:line 65
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
</Data>
</EventData>
</Event>
关注更新(我看了一下帮助 - 我想我正在通过编辑原始问题来做到这一点。让我知道我是否应该以不同的方式跟进)。还有更多我试图缩小问题的范围(所以我理解是否有人等待回答),但我想根据要求更新代码。
首先,感谢编辑上面的敏感信息 - 我没有意识到这是一个问题。无论如何,我发现我的代码的旧部分(我认为错误在哪里)是使用不同的代码访问数据库,所以我更新并整合,以便我的所有数据库访问都在相同的代码中进行:
Private Function GetDataSet_ODBC() As System.Data.DataSet
Dim dsDataSet As New System.Data.DataSet
If Me.bWriteToTraceFile Then Me.WriteToTextFile("START GetDataSet_ODBC", System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", False)
Dim DataAdapter As New System.Data.Odbc.OdbcDataAdapter
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Created DataAdapter", System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
Dim i As Integer
Dim iUBound As Integer
Dim iRetryCount As Integer
Dim dStart As Double
Dim dFinish As Double
DataAdapter.SelectCommand = New System.Data.Odbc.OdbcCommand
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Created new command", System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
With DataAdapter.SelectCommand
.CommandType = CommandType.StoredProcedure
.Connection = New System.Data.Odbc.OdbcConnection
.Connection.ConnectionTimeout = 15
.Connection.ConnectionString = "Driver={Microsoft Access Driver (*.mdb)};" & _
"DBQ=" & tDBPath & tDBName & ";UID=;PWD=" & tDBPassword
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" ConnectionString=" & .Connection.ConnectionString, System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
End With
DataAdapter.InsertCommand = New System.Data.Odbc.OdbcCommand
With DataAdapter.InsertCommand
.CommandType = CommandType.StoredProcedure
.Connection = DataAdapter.SelectCommand.Connection
End With
DataAdapter.SelectCommand.Connection.Open()
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Connection opened", System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
iUBound = UBound(usrProcedures)
For i = 0 To iUBound
DataAdapter.SelectCommand.CommandText = "Execute " & usrProcedures(i).tName & " " & usrProcedures(i).tParameters
iRetryCount = 0
Do
Try
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Executing... " & Str(i) & " " & usrProcedures(i).tName, System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
DataAdapter.Fill(dsDataSet, usrProcedures(i).tTableName)
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Wrote to " & usrProcedures(i).tTableName, System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
Exit Do
Catch
iRetryCount += 1
If iRetryCount = 25 Then
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Still won't work", System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
Exit Do
End If
dStart = Microsoft.VisualBasic.DateAndTime.Timer
dFinish = dStart + 1
Do Until Microsoft.VisualBasic.DateAndTime.Timer > dFinish
Loop
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Try again " & Str(iRetryCount) & " " & Str(dStart) & Str(Microsoft.VisualBasic.DateAndTime.Timer), System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
End Try
Loop
Next
DataAdapter.SelectCommand.Connection.Close()
If Me.bWriteToTraceFile Then Me.WriteToTextFile(" Connection closed", System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
DataAdapter = Nothing
If Me.bWriteToTraceFile Then Me.WriteToTextFile("FINISH GetDataSet_ODBC", System.AppDomain.CurrentDomain.BaseDirectory & "..\TraceFiles\TraceODBC.txt", True)
Return dsDataSet
End Function
我还将构建的代码提升到了服务器而没有&#34; DEBUG&#34;转身加快速度。这可能是调试时的错误(我将撤消)。现在当两个人同时点击数据库时,它只挂在第二个人身上。但是,现在我可以关闭第二个人浏览器,重新进入,并运行应用程序确定而无需重新启动网站。我尝试了重试次数,并且正在处理一个跟踪文件以查看事情挂起的地方,但也许有些事情适合你。
FYI - 上面的代码接受一个usrProcedure()数组,该数组包含存储的Access参数查询的名称,参数以及我想要返回的数据表的名称。在数据集中可能返回多达10个大多数小表(许多只有1个记录,可能有一个或两个,有100个记录)。我尝试只打了几次数据库,但也许我过头一次检索过多的数据?但我有一个非常强大的服务器(我认为)(专用的Window Server 2008企业版,6.0版Build 6002,SP2,64位,8GB RAM,AMD 2200 Mhz 4核心处理器 - 此时几乎没有流量,由Rackspace托管)。 / p>
无论如何,我在猜测(但会尝试通过跟踪进行验证),第二个人要么通过Tries循环,要么因为没有数据而挂起,要么挂在试试中。
最后,我在两个地方点击了这个数据库访问代码(一个用于检索输入控制数据,另一个用于执行计算)。第一次从我的未编译代码页面调用代码。这似乎永远不会挂起(尽管访问大约相同数量的数据,如果不是更多)。上面的代码在一个已编译的DLL&#34; utilities&#34;项目。第二次,从另一个执行我的计算的DLL项目调用此代码。事情就是这样。不确定这是否相关,只是试图列出所有模式/线索。
列出的代码是否提供了任何线索?
提前致谢, 卡盘
关注更新#2 好的,我在整个代码中写了跟踪文件(使用SessionID作为文件名的一部分),试图找出错误实际发生的位置。仍然出现的问题是当两个用户同时点击该应用程序时。一个成功运行,另一个有未处理的3005错误。但是,错误现在不是&#34;试图打开&#34;上面提到的错误(显然我已经解决了这个问题)。现在3005错误发生在代码中的各个点,通常在事件查看器中指示某行的空变量。每个用户都在提出相同的请求,因此应该得到相同的结果。我的跟踪文件告诉我,我在两个用户实例中读取数据库中相同的记录数,但其中一个实例在读取数据后的某个时间会收到错误。我有很多代码,错误发生在不同的点,所以我不知道发布什么。我现在捕获Global.asax文件中的错误,以重定向用户重新登录并再次运行该应用程序。该应用程序在第二次单独运行时运行良好。
看起来两个实例似乎并不完全相互独立,而且某个实体正在从另一个实体中删除对象或数据。看起来错误发生在不同的点上,这取决于请求何时到达服务器的精确时间。我在跟踪文件中添加的日期戳似乎表明一个实例在另一个实例完成请求时会出错。我检查过Shared例程并删除了那些。我已经检查过以确保所调用的DLL的每个实例都被声明为#34;作为New&#34;。此外,我注意到写入跟踪文件的行并不总是按照它们应该按照代码的顺序显示。
ASP.NET是否自动执行代码的任何异步运行,而我没有做任何特殊的事情,这可能会搞砸了吗?我没有尝试明确地做任何异步的东西,因为它看起来很复杂,但我需要在这里管理一些东西吗?
我还应该寻找什么?
再次提前致谢
答案 0 :(得分:0)
您遇到的错误是您正在尝试打开已打开的连接。您如何处理连接可能存在问题。代码很高兴看到。
此外,您应该始终考虑多个人同时敲击数据库。尝试在多个标签页中打开您的应用程序,您可能会发现同样的问题。
答案 1 :(得分:0)
我发现了我的问题。希望这可以帮助其他人解决类似的问题。
事实证明我在常规代码模块中而不是在类模块中全局声明了一些重要变量,这是Visual Studio解决方案中一个项目的所有部分。 我没有意识到只有类模块中的代码和变量对服务器上的每个用户保持独立。我被它们全部编译到同一个DLL文件中而被抛弃了。所以认为整个DLL被“复制”了。当我在Global.asax中捕获错误,中止会话和重定向页面时,实现了。然后我可以清楚地看到第二个用户在变量重新初始化时立即导致第一个用户出错(最初,我认为这是第二个用户错误)。有点谷歌搜索然后告诉我我需要知道什么。
我认为这实际上也是上述原始数据库问题的原因。我错过了一些旧代码,是从常规代码模块访问数据库,导致与数据库冲突。当我摆脱那些代码并转换为从我现在用来访问数据库的类模块中检索数据时,这已得到修复(尽管我当时没有意识到如何修复它)。
因此,一旦我将所有变量声明移动到类模块中并进行了一些大规模的更改,以通过我的子例程中的常规模块代码的参数传递变量,问题已修复(至少到目前为止)。