@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

接続プールに関して 

1
投稿者投稿内容
Tom
会議室デビュー日: 2004/03/17
投稿数: 13
投稿日時: 2004-04-06 15:05
こんにちは。
ちょっと困っていることがあるんで質問します。
(現状)Webアプリと、Windowsアプリにおいて共通の接続文字列を使用しています。この接続文字列では、Webアプリのパフォーマンスを重視してPoolingを有効にしています
(問題点)Windowsアプリにて、DBのリストアを行なおうとしたとき、直前にWebアプリが動いていると「データベースは、使用中なのでの排他アクセスの獲得に失敗しました」というSqlExceptionが発生して失敗してしまいます
(対応策)@Webアプリのパフォーマンスを犠牲にして、Poolingを無効にする。
A接続文字列をWindowsアプリとWebアプリにて分ける。ただしこの場合でも、直前にWebアプリが動いていると失敗するので、運用でカバーする。

上記@,A以外で何か良い方法はないでしょうか?
後、直前までの接続プールを全て無効にする方法などはないのでしょうか?
いろいろまとまっていないと思いますがよろしくお願いします。
Tom
会議室デビュー日: 2004/03/17
投稿数: 13
投稿日時: 2004-04-06 15:45
すいませんでした。
自己解決しました。
Transact-SQLの”ALTER DATABASE SET SINGLE_USER ”を使用することで解決できたようです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-06 22:08
 解決しているようですが。。。

 次回からは、使用環境を明記してください。私はOracleユーザなので、Oracleで考えていました。って、SqlExceptionはSQL Server用のクラスが出す例外ですが。

 それと、接続プールと、今回の現象は関係ないと思います。接続プールは、切断された高価なデータベースとの接続をプールして、次の接続要求に使い回す機能です。同時実行とは関係ありません。
Tom
会議室デビュー日: 2004/03/17
投稿数: 13
投稿日時: 2004-04-07 01:41
Jittaさん返信ありがとうございます、次回からは、気をつけます。

引用:

Jittaさんの書き込み (2004-04-06 22:08) より:
 それと、接続プールと、今回の現象は関係ないと思います。接続プールは、切断された高価なデータベースとの接続をプールして、次の接続要求に使い回す機能です。同時実行とは関係ありません。



 解決策は見つかったのですが原因を探りたくいろいろ調べたいとおもってます。そういう訳で少々調べた結果を報告します。
わたしはデータベース自体について詳しくはないので、SQLサーバー独自かは定かではないのですが、Poolingを無効にするとはじめに書いたエラーは発生しないんです。Poolingが有効だとしばらくの間、SQLのプロセスにSleep状態で接続が残ってしまうというのが原因ではないかと思います。
また、先ほど書いたエラーは同時実行が原因なわけではなくリストア独自のエラーのようです。(SQLサーバーのエラー番号は3101です)
ヘルプを見る限り、リストア時はリストア以外にリストアするデータベースに関してプロセス(状態はとわない)が存在してはいけないようです。
 つたない文章ですみませんが、何かわかる方は教えて下さい。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-04-07 04:07
引用:

Tomさんの書き込み (2004-04-07 01:41) より:
わたしはデータベース自体について詳しくはないので、SQLサーバー独自かは定かではないのですが、Poolingを無効にするとはじめに書いたエラーは発生しないんです。Poolingが有効だとしばらくの間、SQLのプロセスにSleep状態で接続が残ってしまうというのが原因ではないかと思います。
また、先ほど書いたエラーは同時実行が原因なわけではなくリストア独自のエラーのようです。(SQLサーバーのエラー番号は3101です)
ヘルプを見る限り、リストア時はリストア以外にリストアするデータベースに関してプロセス(状態はとわない)が存在してはいけないようです。


まあ、接続を使いまわすためにプールしておくのが接続のPooling機能(そのまま)ですからね…
要は運用中(稼動中)にリストアを行う事は出来ないってことですよね…
この制限のためにパフォーマンスを犠牲にして接続プールを使わないってのはちょっと本末転倒なきがします。
結局運用ルールとその実行方法の話ですから、リストア時にはWebアプリケーションが停止した状態にするとか、プールが残っていない状態にするしかないですよね。

どのような方法が使えるかは良く知りません、すみません。
1

スキルアップ/キャリアアップ(JOB@IT)