gpt4 book ai didi

Java 应用程序在调用 PreparedStatement 后挂起(针对 SQL Server DB)

转载 作者:行者123 更新时间:2023-12-04 05:11:18 25 4
gpt4 key购买 nike

我正在尝试使用与 SQL Server 2008 R2 DB 对话的 Java 应用程序。该应用程序将数据导入数据库,并具有“测试模式”;数据库请求包含在一个事务中,该事务在最后回滚。

对于特定数据集,该工具会禁用触发器,然后在导入后重新启用它。在测试模式下,在第一次通过时,一切都按预期工作 - “导入”中的数据集没有问题。但是,如果我尝试重复该练习,应用程序会在尝试禁用触发器的位置挂起。

查看 SQL Profiler,我可以看到一个 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

: 不知道是什么问题?或者关于我如何进一步调查的任何建议?

更新 :
当然,上面的跟踪只显示了 sp_prepare。有一个相应的 sp_execute 语句 - 并且缺少 RPC:Completed 跟踪项,表明问题出在 SQL Server 端。修改后的跟踪显示 RPC:Starting 条目 ('exec sp_execute 1'),但没有匹配的 RPC:Completed。

我可以按预期在 SSMS 中运行 sp_prepare & sp_execute(前提是我删除了 set 语句) - 毕竟它在第一次通过时执行正常。

解决方案:
使用 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

最佳答案

这听起来很像您的锁没有正确释放并阻止您的 DDL 执行。

当您的语句挂起时,运行存储过程 sp_who2 .

在该过程的结果中,您将知道哪个 session 阻塞了您的 DDL,然后您可以采取适当的措施。

关于Java 应用程序在调用 PreparedStatement 后挂起(针对 SQL Server DB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14899379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com