質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

4663閲覧

Oracle.ManagedDataAccess.Clientを使用したDB接続で発生するNLBのタイムアウトを回避したい

ware

総合スコア27

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2023/01/26 11:03

前提

C#で開発したWindowsFormApplicationから、NLBを経由してRDS(Oracle)に接続しています。
データベースにアクセスした後に6分ほど放置し、DBのデータを取得・書込しようとすると、NLBのタイムアウトにより以下のエラーが出ます。

ORA-03135: 接続が失われました ---> OracleInternal.Network.NetworkException (0x80004005): ORA-03135: 接続が失われました ---> System.Net.Sockets.SocketException (0x80004005): 既存の接続はリモート ホストに強制的に切断されました。

KeepAliveの設定をすれば良いと思い、↓のサイトなどを参考に変更を行いました。
https://docs.oracle.com/cd/E15817_01/network.111/e05726/tnsnames.htm

「接続文字列内のDESCRIPTIONパラメータの下に(ENABLE=BROKEN)を埋め込むことにより、サポートされているTCP転送でのキープアライブ機能をネット・サービス・クライアントに対して有効にできます。」
  • プログラムの修正
//接続文字列に(ENABLE=broken)を追加 var csb = new OracleConnectionStringBuilder() { UserID = hogehoge, Password = piyopiyo, DataSource = "(DESCRIPTION=**(ENABLE=broken)**(ADDRESS=(PROTOCOL=tcp)(HOST=xxxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=hogepiyo)))" , Pooling = true };
  • クライアントのレジストリにKeepAliveの設定を追加

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
KeepAliveTime 0x000186a0(100000)
KeepAliveInterval 0x000186a0(100000)

動かしてパケットを監視してみたのですが、KeepAliveパケットが投げられていません。

実現したいこと

NLBのタイムアウトが起きないようにしたいです。
DataSourceの書き方が間違っていたり、足りない設定などがあれば教えていただけないでしょうか。

試したこと

クライアントにインストールされたsqlplusから、(ENABLE=broken)を追加したtnsnames.oraの情報を使用して接続するとKeepAliveパケットが投げられていることは確認できています。

補足情報(FW/ツールのバージョンなど)

VisualStudio2017
.NetFramework4.7.1
Oracle.ManagedDataAccess(4.122.18.3)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yu_1985

2023/01/26 11:15

Windows Formsについてよく知らないのですが、まさかクライアントから直接RDSにつなごうとしてますか?
ware

2023/01/26 11:35

クライアントから直接RDSにつなごうとしています。 オンプレからの移設なので、根本を見直すのは難しくて…。
yu_1985

2023/01/26 11:42

RDSがどうかという点を置いといても、インターネットから直接DBに接続する構成を見直されることをおすすめします。セキュリティ上の懸念が大きすぎます。 前段にAPIを立てるなどしてはどうですか。
ware

2023/01/27 00:33

yu_1985さん アドバイスありがとうございます。 一応DirectConnect経由にはなっています。 KOZ6.0さん ありがとうございます! 18.3.0なので19.10以降にバージョンを上げて試してみます。 結果は改めてこちらで報告させていただきます。取り急ぎお礼を。
yu_1985

2023/01/27 04:21

DirectConnect接続であっても、クライアントにDBの接続情報を持たせてるということですよね…?
ware

2023/01/27 07:33

yu_1985さん 質問に張り付けたソースでは接続情報を直書きされていますが、実際には暗号化した設定ファイルにまとめています。 (そのまま張り付けると分かり難いので少し直書きしました。後出しですいません。) ただ、復号化されるリスクなどはあるため100%では無い事は認識しています…。 今後、作り直しの機会がいただけたら、考慮したいと思います。 KOZ6.0さん ODPのバージョンを新しくしたら、KeepAlive設定ができました。 パケットキャプチャでKeepAliveパケットが投げられていることも確認出来ました! ありがとうございます!
guest

回答1

0

自己解決

ODP.NET の 19.10 以降であれば OracleConnection クラスに KeepAlive プロパティがあります。
https://docs.oracle.com/cd/F37623_01/odpnt/ConnectionKeepAlive.html
ドキュメントには、static と書いてありますが、インスタンスプロパティです。(^_^;)

KOZ6.0さんからいただいたコメントの通り、ODP.NETのバージョンを19.10以降にあげ、OracleConnectionのKeepAliveプロパティをtrueにしたところ解決しました。

自己解決では無いですが…自己解決欄に失礼します。
ありがとうございました!

投稿2023/01/27 07:46

ware

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問