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

データベース通信(IMHO)の最良のアプローチはこれです。

  1. 接続を作成

  2. 接続

  3. コマンドを作成

  4. クエリを実行

  5. 破棄コマンド

  6. 接続を破棄

これは、すべてのクエリに対して接続を作成するために、多くのオーバーヘッドとパフォーマンス キラーのようです。ただし、ほとんどの .NET Dataprovider はプーリングをサポートしているため、基本的に開いている接続は引き続き存在し、有効であり、次の要求で再利用されます。

このアプローチは、connection.Stateこれに 100% 依存することはできず、TnsPingfor every クエリを実行するよりも高速であるため、実行するよりもはるかに優れています。

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

この単純なコードを使用すると、データベースと通信する Web サイトの場合と同じように、コネクションレスのアプローチが得られます。必要なのは、巧妙な例外処理だけです (サービス アプリケーションではそれほど難しいことではありません。グローバルな例外ハンドラーを使用し、例外をイベント ログにダンプして、後で再試行してください。

于 2012-09-03T09:13:12.823 に答える
0

VB.net コードに TNSPING を組み込んでみてください。インターウェブでこれを行う方法について、いくつかの指針があるようです。基本的に、vb.net を使用してスクリプト ファイルを実行し、ファイルからリダイレクトされた出力を解釈します。

于 2012-09-03T09:01:24.650 に答える