我看到一个奇怪的间歇连接失败。我的应用程序运行正常,然后开始抛出连接失败异常。在应用重新开始工作之前,需要重置IIS。我已经能够将一些故障追溯到oracle集群的意外重启,但不是全部。有没有人见过这个问题?我在网上搜索过但没找到任何东西。
客户端 - Win2003服务器,IIS运行ASP.net 2.0.50727,代码为VB.NET,通过Oracle Client 10.2.0.1.0进行ODBC连接
服务器 - Oracle数据库10g企业版10.2.0.4.0版 - 在Linux群集上进行64位生产。
失败:
Attempting connection.Open()
FAILED connection.Open()
Message:
Stack Trace:
at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
at Oracle.DataAccess.Client.OracleConnection.Open()
at MABridge2._0.debug.Page_Load(Object sender, EventArgs e) in C:\Documents and Settings\xxxx\My Documents\Visual Studio 2008\Projects\xxx\debug.aspx.vb:line 19
Closed connection
代码:
Imports Oracle.DataAccess.Client
Partial Public Class debug
Inherits System.Web.UI.Page
Dim loggingstring As String
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim connString As New String("Data Source=xxx_rac;Persist Security Info=True;User ID=xxx;Password=xxxxx;")
Using conn As New OracleConnection(connString)
Dim cmd As New OracleCommand()
Response.Write("Attempting connection.Open()" + "<br>")
Try
conn.Open()
Catch ex As OracleException
Response.Write("FAILED connection.Open()" + "<br>")
loggingstring = "Message: " + ex.Message + "<br>" + "Stack Trace:" + ex.StackTrace + "<br>"
Response.Write(loggingstring)
End Try
conn.Close()
Response.Write("Closed connection" + "<br>")
End Using
End Sub
答案 0 :(得分:2)
尝试修改代码以处置您的OracleCommand实例,否则您将遇到可能导致问题的资源泄漏。
Dim connString As New String("Data Source=...")
Using conn As New OracleConnection(connString)
Using cmd As New OracleCommand()
Try
conn.Open()
Catch ex As OracleException
logger.LogError(ex.ToString())
Throw
End Try
End Using
End Using
答案 1 :(得分:1)
总结问题:
基于此,听起来好像您的代码正在泄漏连接或其他资源。
对于效果计数器和活动,请参阅:http://download.oracle.com/docs/html/B13831_01/monitor.htm#i1005706
答案 2 :(得分:0)
我假设您从连接字符串中连接到由多个实例组成的RAC数据库...
如果我的假设是真的,那么可能会有另一种解释:
在RAC配置中,您连接的Oracle侦听器返回告知客户端客户端应连接哪个实例的信息...这意味着:您连接到侦听器A并且侦听器A告诉您连接到实例B.这是部分“在幕后”发生的事情(在Oracle客户端,而不是在您的代码中)。
当听众传达此信息时,它不会告诉您IP地址而是NAME(DNS ...)。如果您的计算机无法解析该名称,您将获得您描述的行为...有时连接工作,有时不会...将所有主机名与所有RAC节点相关联到本地主机或(更好)使它们可以解析DNS在你的局域网......