我已经使用VB创建了一个windows服务,它监听来自表的特定数据的传入请求,并向客户端提供数据。该应用程序运行良好;但是,在夜间,我们会断开数据库连接一段时间以进行备份。然后再次启动数据库。但是,不会重新启动windows服务。第二天,当任何客户端请求数据时,我会收到ORA-03113;通信通道异常的文件结束,此行发生异常
connection.Execute("my query goes here")我甚至尝试在收到客户端对数据的任何请求时立即进行如下检查。
If connection.State = ConnectionState.Closed Then
connection.Open()
End If 有人能告诉我我到底做错了什么吗?谢谢
发布于 2012-09-03 17:13:13
数据库通信(IMHO)的最佳方法就是这种方法。
这似乎是为每个查询创建连接的大量开销和性能杀手。但是,大多数.NET数据提供程序都支持池化,因此基本上打开的连接仍然有效,并将在下一次请求时回收。
这种方法比执行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有了这个简单的代码,你就有了一种无连接的方法,就像你拥有一个与你的数据库通信的网站一样。您所需要的就是巧妙的异常处理(对于服务应用程序来说,这应该不是很困难。只需使用全局异常处理程序,将异常转储到事件日志并稍后重试。
发布于 2012-09-03 17:01:25
尝试将TNSPING合并到您的VB.net代码中。似乎有一些关于如何在互联网上做到这一点的提示。基本上,使用vb.net运行脚本文件并解释来自文件的重定向输出。
https://stackoverflow.com/questions/12242414
复制相似问题