- - PR -
接続プールに関して
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2004-04-06 15:05
こんにちは。
ちょっと困っていることがあるんで質問します。 (現状)Webアプリと、Windowsアプリにおいて共通の接続文字列を使用しています。この接続文字列では、Webアプリのパフォーマンスを重視してPoolingを有効にしています (問題点)Windowsアプリにて、DBのリストアを行なおうとしたとき、直前にWebアプリが動いていると「データベースは、使用中なのでの排他アクセスの獲得に失敗しました」というSqlExceptionが発生して失敗してしまいます (対応策)@Webアプリのパフォーマンスを犠牲にして、Poolingを無効にする。 A接続文字列をWindowsアプリとWebアプリにて分ける。ただしこの場合でも、直前にWebアプリが動いていると失敗するので、運用でカバーする。 上記@,A以外で何か良い方法はないでしょうか? 後、直前までの接続プールを全て無効にする方法などはないのでしょうか? いろいろまとまっていないと思いますがよろしくお願いします。 | ||||
|
投稿日時: 2004-04-06 15:45
すいませんでした。
自己解決しました。 Transact-SQLの”ALTER DATABASE SET SINGLE_USER ”を使用することで解決できたようです。 | ||||
|
投稿日時: 2004-04-06 22:08
解決しているようですが。。。
次回からは、使用環境を明記してください。私はOracleユーザなので、Oracleで考えていました。って、SqlExceptionはSQL Server用のクラスが出す例外ですが。 それと、接続プールと、今回の現象は関係ないと思います。接続プールは、切断された高価なデータベースとの接続をプールして、次の接続要求に使い回す機能です。同時実行とは関係ありません。 | ||||
|
投稿日時: 2004-04-07 01:41
Jittaさん返信ありがとうございます、次回からは、気をつけます。
解決策は見つかったのですが原因を探りたくいろいろ調べたいとおもってます。そういう訳で少々調べた結果を報告します。 わたしはデータベース自体について詳しくはないので、SQLサーバー独自かは定かではないのですが、Poolingを無効にするとはじめに書いたエラーは発生しないんです。Poolingが有効だとしばらくの間、SQLのプロセスにSleep状態で接続が残ってしまうというのが原因ではないかと思います。 また、先ほど書いたエラーは同時実行が原因なわけではなくリストア独自のエラーのようです。(SQLサーバーのエラー番号は3101です) ヘルプを見る限り、リストア時はリストア以外にリストアするデータベースに関してプロセス(状態はとわない)が存在してはいけないようです。 つたない文章ですみませんが、何かわかる方は教えて下さい。 | ||||
|
投稿日時: 2004-04-07 04:07
まあ、接続を使いまわすためにプールしておくのが接続のPooling機能(そのまま)ですからね… 要は運用中(稼動中)にリストアを行う事は出来ないってことですよね… この制限のためにパフォーマンスを犠牲にして接続プールを使わないってのはちょっと本末転倒なきがします。 結局運用ルールとその実行方法の話ですから、リストア時にはWebアプリケーションが停止した状態にするとか、プールが残っていない状態にするしかないですよね。 どのような方法が使えるかは良く知りません、すみません。 |
1