首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-03113:数据库重新启动时VB应用程序中通信通道上的文件结束

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

Stack Overflow用户
提问于 2012-09-03 13:27:16
回答 2查看 1.6K关注 0票数 0

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

代码语言:javascript
复制
connection.Execute("my query goes here")

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

代码语言:javascript
复制
If connection.State = ConnectionState.Closed Then
       connection.Open()
End If 

有人能告诉我我到底做错了什么吗?谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-03 17:13:13

数据库通信(IMHO)的最佳方法就是这种方法。

  1. Create command
  2. Dispose query
  3. Dispose Connection
  4. Connect
  5. Create command
  6. Execute connection
  7. Dispose

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

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

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

示例代码:

代码语言:javascript
复制
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

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

票数 2
EN

Stack Overflow用户

发布于 2012-09-03 17:01:25

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12242414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档