SQL Server 2008 R2 DB と通信する Java アプリを理解しようとしています。アプリはデータを DB にインポートし、「テスト モード」があります。DB リクエストはトランザクションにラップされ、最後にロールバックされます。
特定のデータセットでは、ツールはトリガーを無効にし、インポート後に再度有効にします。テスト モードでは、最初のパスですべてが期待どおりに機能します。データセットは問題なく「インポート」されます。ただし、演習を繰り返そうとすると、トリガーを無効にしようとした時点でアプリがハングします。
SQL プロファイラーを見ると、RPC:Completed トレース アイテムが表示されます。これは、SQL Server が要求を受信して正常に処理したことを示しています。その時点で、Java アプリが制御を取得して続行することを期待しますが、そうではないことを除けば、次にどこを見ればよいか考えるのに苦労しています。
Java コード:
String sql = "ALTER TABLE MyTable DISABLE TRIGGER ALL";
PreparedStatement stmt = mDBConnection.prepareStatement (sql);
stmt.execute();
テキストデータのトレース:
declare @p1 int
set @p1=1
exec sp_prepare @p1 output,N'',N'ALTER TABLE MyTable DISABLE TRIGGER ALL',1
select @p1
Q : どのような問題が考えられますか? または、さらに調査する方法に関する提案はありますか?
更新: もちろん、上記のトレースは sp_prepare のみを示しています。対応する sp_execute ステートメントがあり、RPC:Completed トレース項目がないことは、問題が SQL Server 側にあることを示しています。変更されたトレースは、RPC:Starting エントリ ('exec sp_execute 1') を示していますが、一致する RPC:Completed はありません。
予想どおり、SSMS で sp_prepare & sp_execute を実行できます (set ステートメントを削除した場合)。結局、最初のパスで OK を実行します。
解決策: sp_who2 (以下を参照) を使用すると、最初の接続/spid が 2 番目の接続/spid でブロックされていることがわかりました。コミット時にデータベース接続が閉じられましたが、ロールバックでは閉じられませんでした。私はテスト アンド ロールバック モードで実行しているので、これが問題の核心でした。接続を閉じると問題が解決しました。
sp_who2:
CREATE TABLE #sp_who2
(
SPID INT,
Status VARCHAR(1000) NULL,
Login SYSNAME NULL,
HostName SYSNAME NULL,
BlkBy SYSNAME NULL,
DBName SYSNAME NULL,
Command VARCHAR(1000) NULL,
CPUTime INT NULL,
DiskIO INT NULL,
LastBatch VARCHAR(1000) NULL,
ProgramName VARCHAR(1000) NULL,
SPID2 INT,
RequestID int
)
GO
INSERT INTO #sp_who2 EXEC sp_who2
GO
SELECT spid, status, blkby, command, ProgramName FROM #sp_who2 WHERE DBName = 'rio7_bch_test'
GO
DROP TABLE #sp_who2
GO