间歇性的vb.net oracle连接问题

时间:2011-08-22 20:03:29

标签: asp.net vb.net oracle

我看到一个奇怪的间歇连接失败。我的应用程序运行正常,然后开始抛出连接失败异常。在应用重新开始工作之前,需要重置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

3 个答案:

答案 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)

总结问题:

  • 连接打开时发生错误
  • 系统使用一段时间后发生错误
  • 通过执行IIS重置
  • 可以临时解决错误

基于此,听起来好像您的代码正在泄漏连接或其他资源。

对于效果计数器和活动,请参阅: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在你的局域网......