0

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

connection.Execute("my query goes here")

我什至尝试在收到客户的任何数据请求后立即进行如下检查。

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

谁能在这里指导我我到底做错了什么。谢谢

4

2 回答 2

2

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

  1. 创建连接

  2. 连接

  3. 创建命令

  4. 执行查询

  5. 处置命令

  6. 处置连接

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

这种方法比执行 a要好得多,connection.State因为您不能 100% 依赖它,并且比TnsPing为每个查询执行 a 更快。

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

使用这个简单的代码,您将拥有一种无连接的方法,就像您使用与您的数据库通信的网站一样。您所需要的只是巧妙的异常处理(这对服务应用程序来说应该不难。只需使用全局异常处理程序,将异常转储到事件日志并稍后重试。

于 2012-09-03T09:13:12.823 回答
0

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

于 2012-09-03T09:01:24.650 回答