none
[VB2005 & Oracle]ORA-03135 「接続が失われました」について RRS feed

  • 質問

  • いつもお世話になっております。

    開発環境は、VisualBasic2005 , Oracle 9.2.0.8.0 , Oracle 10.1.0.4.0 です。

    9iのデータベースは、他の場所にあります。(社内にはありません。)

    VB2005(ODP.NET2.0)を使用して、アプリケーションを作成しております。

    非接続型である、OracleDataAdapterをコード内にて、New で宣言し、DataSetを作成。そして、そのDataSetを使用して、DataGridViewにデータバインドを行っております。

    非接続型であるといっても、セッションが開始されていると認識しており、9iのデータベースは、ある一定の時間が経過したら、セッションを切断される仕組みになっているそうです。

    アプリケーションにて、検索結果を表示し、ユーザーの入力が終了するまでにセッションが切断されてしまって表題のエラーが発生してしまいます。

    OTNやこちらの過去ログなど、色々と参照しましたが、問題が解決できませんでした。

    皆様の良い知恵をお借りしたいと思い、投稿させて頂きました。宜しく御願い致します。

    コードの内容の一部は以下の通りです。

    Dim Conn AS New OracleConnection
    Dim Cmd AS New OracleCommand
    Conn.ConnectionString = XXX_connectionString → Public Const にて宣言済み
    Conn.Open()
    Cmd.Connection = Conn
    Cmd.CommandText = Sql_String → SQL文は、独自の関数にて作成し、ここに代入しています。
    Dim oda As New OracleDataAdapter(Cmd)
    'データセット作成
    Dim ds As New DataSet
    If ds.Tables.Contains("TableName") Then ds.Tables("TableName").Clear()
    oda.Fill(ds, "TableName")
    Cmd.Dispose()
    Conn.Close()
    Conn.Dispose()

    以上、宜しく御願い致します。

    2007年3月22日 2:18

回答

  •  MR-Giabbit さんからの引用
    コードの内容で、初歩的な(初心者で、よくわかっておりませんでしたが。)ミスをしていました。
    コネクションのオープン、及びクローズはいらないですね。調べていて、気づきました。

    別に自分で行っても大丈夫なので、ミスという訳ではないと思いますよ。
    DataAdapter は、閉じたコネクションを渡せば Open&使用&Close を行ってくれますが、接続中のコネクションを渡せば Open も Close もされず、そのまま接続が使用される、という動作をします。

    当てずっぽうですが、Pooling は関係ないでしょうか?
    ODP.NET は、デフォルトで Pooling が有効になっています(私は使っていないので調べた情報ですが)。
    以下の流れを想像しています。

    1. 初回の問い合わせ&切断
       (ここで使用した接続が pooling される)
    2. 何らかの原因により pooling されている接続が有効でなくなる
       (ただし pooling としては残っている)
    3. 再検索実行
       → pooling されていた無効な接続が使用されてエラーが発生する。

    問題の切り分けとして、一度 Pooling を無効にして様子を見られてはいかがでしょう。
    (ただし、もし Pooling の恩恵を受けていた場合は、レスポンスが落ちる場合があります)


     MR-Giabbit さんからの引用
    ADO(ADO.NETでは無くて)

    なぜ、ADO.NET(System.Data.OracleClient)は選択肢に無いのでしょう?(^^;
    2007年4月2日 11:02

すべての返信

  •  MR-Giabbit さんからの引用

    いつもお世話になっております。

    Dim Conn AS New OracleConnection
    Dim Cmd AS New OracleCommand
    Conn.ConnectionString = XXX_connectionString → Public Const にて宣言済み
    Cmd.Connection = Conn
    Cmd.CommandText = Sql_String → SQL文は、独自の関数にて作成し、ここに代入しています。
    Dim oda As New OracleDataAdapter(Cmd)
    'データセット作成
    Dim ds As New DataSet
    If ds.Tables.Contains("TableName") Then ds.Tables("TableName").Clear()
    oda.Fill(ds, "TableName")
    Cmd.Dispose()

    いつもお世話になっております。

    コードの内容で、初歩的な(初心者で、よくわかっておりませんでしたが。)ミスをしていました。

    コネクションのオープン、及びクローズはいらないですね。調べていて、気づきました。

    コードにミスがあったのは確かですが、問題はまだ解決できておりません。

    宜しく御願い致します。

    2007年3月23日 4:33
  •  MR-Giabbit さんからの引用

    アプリケーションにて、検索結果を表示し、ユーザーの入力が終了するまでにセッションが切断されてしまって表題のエラーが発生してしまいます。


    どこで発生していますか? 提示されたコード中ではないと思いますが。

     

     MR-Giabbit さんからの引用

    Dim oda As New OracleDataAdapter(Cmd)


    この OracleDataAdapter インスタンスを破棄せずに、 あとでまた使おうとしてるとか?

    2007年3月26日 23:42
  • いつもお世話になっております。

    返信が遅くなり、大変申し訳ありませんでした。

    biac様、返信ありがとうございます。

     biac さんからの引用

     MR-Giabbit さんからの引用

    アプリケーションにて、検索結果を表示し、ユーザーの入力が終了するまでにセッションが切断されてしまって表題のエラーが発生してしまいます。


    どこで発生していますか? 提示されたコード中ではないと思いますが。

    情報が足りませんでした。申し訳ありません。

     「再検索」と言う、ボタンがあり、Clickイベントにて、もう一度、OracleDataAdapterを作成しています。

    Fill メソッドを実行したときに、おきています。

     biac さんからの引用
     MR-Giabbit さんからの引用

    Dim oda As New OracleDataAdapter(Cmd)


    この OracleDataAdapter インスタンスを破棄せずに、 あとでまた使おうとしてるとか?

    OracleConnection 及び、OracleCommand 、OracleDataAdapter の破棄をしていないみたいです。

    このコードを追加しなければだめですね。基本ができてなかったです。

    もう一度、作成して、結果を報告致します。

    またお聞きするかと思いますが、宜しく御願い致します。

    的確なアドバイスをありがとうございます。

     返信ありがとうございました。
    2007年3月27日 2:13
  • いつもお世話になっております。

    その後の経過をご報告致します。

     

    インスタンスの破棄を行い、全てに抜けている所が無いかを確認しましたが、問題が解決されませんでした。

     

    色々な接続方法があると思いますが、OO4Oを使用するのもどうかと思いますし、ADO(ADO.NETでは無くて)

    を使用するのも、VS2005(VB2005)ではあまりいい方向にはいきそうにありません。

     

    何かご存知の方がいらっしゃいましたら、宜しく御願い致します。

    2007年4月2日 7:30
  •  MR-Giabbit さんからの引用
    コードの内容で、初歩的な(初心者で、よくわかっておりませんでしたが。)ミスをしていました。
    コネクションのオープン、及びクローズはいらないですね。調べていて、気づきました。

    別に自分で行っても大丈夫なので、ミスという訳ではないと思いますよ。
    DataAdapter は、閉じたコネクションを渡せば Open&使用&Close を行ってくれますが、接続中のコネクションを渡せば Open も Close もされず、そのまま接続が使用される、という動作をします。

    当てずっぽうですが、Pooling は関係ないでしょうか?
    ODP.NET は、デフォルトで Pooling が有効になっています(私は使っていないので調べた情報ですが)。
    以下の流れを想像しています。

    1. 初回の問い合わせ&切断
       (ここで使用した接続が pooling される)
    2. 何らかの原因により pooling されている接続が有効でなくなる
       (ただし pooling としては残っている)
    3. 再検索実行
       → pooling されていた無効な接続が使用されてエラーが発生する。

    問題の切り分けとして、一度 Pooling を無効にして様子を見られてはいかがでしょう。
    (ただし、もし Pooling の恩恵を受けていた場合は、レスポンスが落ちる場合があります)


     MR-Giabbit さんからの引用
    ADO(ADO.NETでは無くて)

    なぜ、ADO.NET(System.Data.OracleClient)は選択肢に無いのでしょう?(^^;
    2007年4月2日 11:02
  • いつもお世話になっております。

    TH01 様、ご返信ありがとうございます。

     

    Poolingの可能性、調査してみたいと思います。しかし、それが関係していたとすれば、今後の開発にもかなり影響が出てくるものと思います。

     

    レスポンスも現状、データベースリンクを使用している為、それだけでもかなり悪いです。

     

    どちらも含めて、また調査します。

    情報のご返信、ありがとうございました。またよろしく御願い致します。

     

    PS

     ADO.NET ......... 存在を忘れていたわけではないです。以前に作られているシステム(VB6)のやり方で、どうだろうと言う話があったので。

     

    2007年4月3日 4:52
  • いつもお世話になっております。

     

    TH01様のおっしゃるとおり、 Pooling が関係していました。接続文字列にて、このプーリング機能を無効とした事で

    この問題が解決されました。

     

    ご教授いただいた皆様、ありがとうございました。

     

    またお聞きする事もあるかと思いますが、宜しく御願い致します。

    2007年4月6日 6:16
  • データベース・リンクは、以前、不可解なことに遭遇してから嫌いになりました。(^^;
    そのため実は、データベース・リンクと書かれているのを見て、もしかして Pooling は関係ないかも、なんて気になっていましたが、結果がお聞きできてよかったです。
    もしかすると軽減されただけかもしれませんが、それでも前進かな。

    なお、ODP.NET には Pooling に関するパラメータが幾つかあるようですので、それらの値を適切にすれば Pooling を無効にしないで済むかもしれません。一度、調査されてみてはと思います。
    # 仕様に書いてあることで理解できないことが幾つかあったので、私には何が適切かはわかりませんが(^^;

    2007年4月6日 8:16
  • いつもお世話になっております。

    返信が遅くなり、大変申し訳ありません。

     TH01 さんからの引用

    データベース・リンクは、以前、不可解なことに遭遇してから嫌いになりました。(^^;
    そのため実は、データベース・リンクと書かれているのを見て、もしかして Pooling は関係ないかも、なんて気になっていましたが、結果がお聞きできてよかったです。
    もしかすると軽減されただけかもしれませんが、それでも前進かな。

     

    私としては、かなり前進できたと思っております。データベースリンク自体、かなり厄介者みたいですね。

    データベースリンクしか方法が分からなかったもので。

     TH01 さんからの引用

    なお、ODP.NET には Pooling に関するパラメータが幾つかあるようですので、それらの値を適切にすれば Pooling を無効にしないで済むかもしれません。一度、調査されてみてはと思います。

     

    色々と接続文字列部分で設定が出来るみたいですね。今後も調査してみます。

     

     TH01 さんからの引用

    # 仕様に書いてあることで理解できないことが幾つかあったので、私には何が適切かはわかりませんが(^^;

     

    説明が足りない部分があるかと思います。申し訳ありません。

    ここまで調べて下さった事で、解決に向かっているのは間違いありません。

    大変感謝しています。

    TH01様、返信ありがとうございました。

    2007年4月9日 9:14