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

SQLサーバーの最終のTSQLコマンドバッチクリアについて

1
投稿者投稿内容
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2005-08-03 16:42
お世話になります。
VB.NET2003とSQLServer2000を利用しています。

 現在,あるアプリを終了時にSQLDMO-Backupオブジェクトを利用して
データベースのバックアップ。そして,画面上よりバックアップより
のリストアをSQLDMO-Restoreオブジェクトを利用して実装途中です。

 通常のバックアップとリストアは成功しましたが,下記の条件の時
にリストアが出来ず困っています。

===============================================================
1:リストア処理ボタンを押す
2:★テーブルAの件数を確認
cn.Open()
cmd.Connection = cn
cmd.CommandText = " SELECT COUNT(*) FROM TableA "
intCoount = cmd.ExecuteScalar()
cn.Close()
3:Aの件数が0の時はリストア処理開始
================================================================

上記の2が無ければリストアは成功しますが,2の処理を加えると
データベースの排他エラーとなり失敗します。

SQLサーバー上のプロセス情報を調べると2の処理をした場合,
サーバーに対して"SELECT COUNT(*) FROM TableA"のコマンドバッチ
が渡されたまま残っている為,排他エラーとなってしまっている
ようでした。(アプリを走らせているクライアントのユーザーの
プロセス)

2の処理が終了時点で該当プロセスのコマンドバッチをクリアする
方法を色々と試してみましたが,うまくいきません。

何か良い方法をご存知の方がいらっしゃいましたらご教授頂ければ
と思います。

宜しくお願いいたします。
にしざき
ぬし
会議室デビュー日: 2003/06/30
投稿数: 304
投稿日時: 2005-08-03 17:03
思いつきですが、コネクションプーリングが有効になっているために
実際にはコネクションが閉じられていないとか。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2005-08-03 17:57
にしざき様
お世話になります。
(既述をし忘れて言いましたがWinアプリです)

恥ずかしながらコネクションプールについて詳しく調べたことがなかったので
調べてみたところ,おっしゃる通りプールを無効とする接続文字列を利用すれば
リストアの処理が出来ました。

ただ,コネクションプールの利便性は捨てがたい(検索を頻繁に行う業務の為)と
感じ,出来ればこのリストア処理の前処理(上記の2処理)の時だけプールを無効
にしたいと思うのですが,そのようなことは可能でしょうか?

データベースへの最初の接続が開いた時に,それ固有の接続プールが作成されるとのことだったので,ひょっとして無理なのでは?と思ったのですが,何か方法はありますでしょうか?

ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-08-03 19:03
確かコネクションプーリングはConnectionStringが完全一致している必要がありますのでその場合だけ別の接続文字列(つまりコネクションプーリングをOffにする)でアクセスすればよいかと。
さかもと
ぬし
会議室デビュー日: 2004/05/14
投稿数: 586
投稿日時: 2005-08-03 19:37
ya様

 ご返答ありがとうございます。
確かに違う文字列で接続にいけば・・・と考えていたのですが。
開発中のアプリはよくよく考えてみれば(よく考えなくても)他PC
からの接続もあります。

 そうすると,該当PCだけ他の接続文字列にして・・・ということを
やったとしても他PCの接続が生きていればダメ・・・ですよね?

 それと,まだ実験途中なのですが,該当PCから接続して,
上記2処理(最初の投稿)とは別のコネクションを張ったとしても
最初の文字列でのコネクションは残ったままで別のコネクションが
張られる(プールが無効なもの)のではないかと思います。

 よって今考えているのは
リストア処理開始時に,他IDのプロセスが実行中で無いかを見て,
実行中なら強制終了か他PCへメッセージを送り,全ての処理を終了
してもらった後にリストア処理を走らせれば?と思っています。
(もちろん相当に考慮がかけているとは思いますが・・・)
(思い切ってプールを全面的に無効にしたほうが早いでしょうか?)

 「画面からパッ!とリストアできるようにして」というご要望を受けた
のが間違いなんでしょうか・・・。

 まだまだ分からないことだらけなので,進捗があり次第ご報告させて
頂きます。
 
 又,何か良い方法をご存知の方がいらっしゃいましたらご教授の程
宜しくお願いいたします。

1

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