データベースに接続できるかの判定


ひる  2010-09-13 15:15:51  No: 71937  IP: [192.*.*.*]

CDatabaseを使ってODBC経由でSQLServerにアクセスするアプリを作っています。
ただし、SQLServerにアクセスできないときには、
オフラインモード(ローカルデータのみを処理)で動かす必要があります。

そのため、Open()やOpenEx()でSQLServerにアクセスする前に、
そもそもSQLServerにアクセス可能な状態かを判定したいのですが、
そのようなことは可能でしょうか?

SetLoginTimeout()の値を小さくすればとは思ったのですが、
この値を小さくすると、環境によってはアクセス可能な状態なのに
タイムアウトになることがあり得るでしょうし、
デフォルトの15秒のままだと、アクセス不可能な状態であることを知ること自体に
時間がかかって待たされてしまいます。

そもそもOpen()を行う以前に、
Open()を実行してよい環境なのかを知りたい状態です。
なにかODBCやCDatabaseに判定する仕組みはあるのでしょうか。

編集 削除
επιστημη  URL  2010-09-13 23:15:57  No: 71938  IP: [192.*.*.*]

Openできるか確認し、OKだとわかってから実際にOpen()するまでの
わずかな間にダメになってたらどうします?

編集 削除
ryo  2010-09-14 00:39:35  No: 71939  IP: [192.*.*.*]

私がデータベースのソフトの作成者で
一瞬で、確実に、「OPEN」できるかどうかの判断機能が用意できるなら
Openとは別にそれを実装するなんてことせずに
Openの中で、最初にそれを呼び出して、
駄目なときはTimeOutとか関係なしに即座にエラーを返すよう
「OPEN」を実装する

編集 削除
ひる  2010-09-14 09:17:06  No: 71940  IP: [192.*.*.*]

> Openできるか確認し、OKだとわかってから実際にOpen()するまでの
> わずかな間にダメになってたらどうします?

今回の件では、そのときはもう「レアケース」として、
Open()で15秒以上固まっても構わないと思っています。
実際、Open()を使う判定なら正しく動作しているので。

ただ、DBではなくファイルに例えると、
ファイルを開く前にまずファイルそのものを探して、
見つからないときは即、次の動作に移れないかなと思ったのです。

ネットワークにつながっていなかったりして、
明らかにDBに接続できない状態のはずなのに、
デフォルトだと15秒以上Open()から返ってこないのは
避けられないものかなと感じました。

> 私がデータベースのソフトの作成者で
> 一瞬で、確実に、「OPEN」できるかどうかの判断機能が用意できるなら
> Openとは別にそれを実装するなんてことせずに
> Openの中で、最初にそれを呼び出して、
> 駄目なときはTimeOutとか関係なしに即座にエラーを返すよう
> 「OPEN」を実装する

たしかに上記のファイルの例だと、
見つからない場合はファイルを開く動作自体すぐに失敗するはずですし、
CDatabaseにそのような仕組みが無いということは、
このような動作には対応できないものということになるのでしょうか。

編集 削除
ryo  2010-09-14 12:49:10  No: 71941  IP: [192.*.*.*]

>見つからない場合はファイルを開く動作自体すぐに失敗するはずですし、
これについてなんですが

①A,Bの2台のPCを用意する
②Bの共有フォルダにTXTファイルを用意する
③AからBの共有フォルダを開き、
  TXTファイルを開くためのショートカットをA側につくる
④BのPCをネットワークから切断する(電源落とすとかでも)

この状況で、Aのショートカットを使用し、ファイルを開こうとしてみてください。
すぐに「リンクが切れている」とエラーがでますか?

編集 削除
pp  2010-09-14 16:59:14  No: 71942  IP: [192.*.*.*]

これは難しいというか、確立?になるのかなぁ
すみません、10cmの本でも解決できないと思います。

絶対的なサーバにデータの送信時間管理ができるものがあれば・・・無理ですね前日のなんて。。。。。

編集 削除
とと  2010-09-24 22:15:23  No: 71943  IP: [192.*.*.*]

①pingでも打ってみる
②OKなら上記手段でサーバーにお伺いを立ててみる

Ping無視の設定だと①は使えません。

②IPを指定してUDPの1434番に存在をリクエストして
応答見る方法もあります。これもセキュリティの関係で
ポート閉じていることもあるので、そしたら駄目ですね。

サーバー側に定期的にSQLServerの生存を確認するプログラムを
常駐させておいて、特定のポートで生存の応答をさせる仕組みを
作ると多少は違うかも。

編集 削除
てて  2010-09-25 07:25:47  No: 71944  IP: [192.*.*.*]

CDatabaseを使ってODBC経由でSQLServerにアクセスするアプリの
起動と同時に内部でスレッドを切り出して定期的に負荷の軽い SQLを
発行してはいかがでしょうか?
そのスレッドでオンライン/オフラインのステータスを保持するよう
にしておいて

メインスレッドでSQLServerにアクセスする際にはそのステータスを参照
してオンラインステータスなら SQLServerにアクセス、オフラインなら
ローカルデータを使う

編集 削除