我正試圖抓住與SQL Server 2008 R2數據庫交談的Java應用程序。應用程序將數據導入數據庫,並具有「測試模式」; DB請求被封裝在一個事務中,並在最後回滾。Java應用程序在調用PreparedStatement之後掛起(針對SQL Server數據庫)
對於特定的數據集,該工具會禁用觸發器,然後在導入後重新啓用它。在測試模式下,在第一遍時,一切都按預期工作 - 「導入」中的數據集沒有問題。但是,如果我嘗試重複練習,則應用會停止在試圖禁用觸發器的位置。
看着SQL事件探查器,我可以看到一個RPC:已完成的跟蹤項目,這表明SQL Server已收到併成功處理了請求。在這一點上,我期望Java應用程序能夠控制和繼續 - 除非它不這樣做,我正在努力思考接下來要看的東西。
Java代碼:
String sql = "ALTER TABLE MyTable DISABLE TRIGGER ALL";
PreparedStatement stmt = mDBConnection.prepareStatement (sql);
stmt.execute();
跟蹤的TextData:
declare @p1 int
set @p1=1
exec sp_prepare @p1 output,N'',N'ALTER TABLE MyTable DISABLE TRIGGER ALL',1
select @p1
Q:任何想法,問題可能是什麼?或者關於我如何進一步調查的任何建議?
UPDATE: 當然,上面的跟蹤只顯示sp_prepare。有一個相應的sp_execute語句 - 並且缺少RPC:已完成的跟蹤項目,表示問題出現在SQL Server端。修改的跟蹤顯示RPC:啓動項('exec sp_execute 1'),但沒有匹配的RPC:已完成。
我可以在SSMS中運行sp_execute & sp_execute(提供我刪除set語句),如預期的那樣 - 它在第一遍中執行OK。
解決方案: 使用sp_who2(見下文),我可以看到,有第一連接/ 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
當您使用SQL Server Management Studio執行它時會發生什麼? – 2013-02-15 17:17:01
@MarkRotteveel - 不確定;有幾次它已經工作(@ sp = 2),但通常它不會(''找不到預處理語句1')。 – CJM 2013-02-15 17:27:26
@MarkRotteveel - 如果我刪除了'set @ p1 = 1',語句在SSMS中執行OK。 – CJM 2013-02-18 09:40:51