ORA-03113:数据库重启时VB应用程序中通信通道上的文件结束

时间:2012-09-03 05:27:16

标签: vb.net oracle database-connection

我使用VB制作了一个Windows服务,它监听来自表的特定数据的传入请求,并向客户端提供数据。该应用程序正常;但是,到了晚上我们断开数据库一段时间才能进行备份。然后再次启动数据库。但是,Windows服务未重新启动。第二天当任何客户请求数据时,我得到ORA-03113;通信信道上的文件结束在此行发生的异常

connection.Execute("my query goes here")

一旦我收到客户的数据请求,我甚至试图像下面这样检查。

If connection.State = ConnectionState.Closed Then
       connection.Open()
End If 

任何人都可以在这里指导我到底做错了什么。谢谢

2 个答案:

答案 0 :(得分:2)

数据库通信的最佳方法(恕我直言)就是这个。

  1. 创建连接

  2. 连接

  3. 创建命令

  4. 执行查询

  5. 处理命令

  6. 处理连接

  7. 这似乎是一个很大的开销,并且是为每个查询创建连接的性能杀手。但是,大多数.NET Dataproviders都支持池化,因此基本上开放连接仍然存在且有效,并将在下次请求时回收。

    此方法优于执行connection.State,因为您无法100%依赖此方法,并且比为每个查询执行TnsPing更快。

    oracle的连接池:http://msdn.microsoft.com/en-us/library/aa719767(v=vs.71).aspx

    示例代码:

    Public Static Readonly ConnectionString = "Data Source=MyOracleServer;Integrated Security=yes;"
    Public Shared Function ExecuteScalar(of T)(string commandString)
    
        Using con As new OracleConnection(connectionString)
    
           con.Open()
    
           Using cmd As new OracleCommand(con, commandString)
    
               Return CType(cmd.ExecuteScalar(), T)
    
           End Using
    
        End Using ' this one will call con.Dispose() which will close the connection
    
    End Function
    

    使用这个简单的代码,您可以使用无连接方法,就像使用与您的数据库通信的网站一样。您所需要的只是聪明的异常处理(对于服务应用程序而言应该很难。只需使用全局异常处理程序,将异常转储到事件日志中,然后再重试。

答案 1 :(得分:0)

尝试将TNSPING合并到VB.net代码中。 关于如何在interweb上执行此操作似乎有一些指示。 基本上,使用vb.net运行脚本文件并从文件中解释重定向的输出。