我使用VB制作了一个Windows服务,它监听来自表的特定数据的传入请求,并向客户端提供数据。该应用程序正常;但是,到了晚上我们断开数据库一段时间才能进行备份。然后再次启动数据库。但是,Windows服务未重新启动。第二天当任何客户请求数据时,我得到ORA-03113;通信信道上的文件结束在此行发生的异常
connection.Execute("my query goes here")
一旦我收到客户的数据请求,我甚至试图像下面这样检查。
If connection.State = ConnectionState.Closed Then
connection.Open()
End If
任何人都可以在这里指导我到底做错了什么。谢谢
答案 0 :(得分:2)
数据库通信的最佳方法(恕我直言)就是这个。
创建连接
连接
创建命令
执行查询
处理命令
处理连接
这似乎是一个很大的开销,并且是为每个查询创建连接的性能杀手。但是,大多数.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运行脚本文件并从文件中解释重定向的输出。