从JDBC调用时,无法使用BCP将表数据转储到文件

时间:2011-01-05 14:19:53

标签: tsql jdbc bcp jdbctemplate

我编写了一个将表数据转储到文本文件中的过程(假设相关变量已经声明);

SET @sql = '"SELECT * FROM ##OutputData"'

SET @cmdline = 'bcp '+ @sql +' queryout '+@OutputPath+'\outputFile.csv -c -t -T -S' + @@ServerName

EXEC master..xp_cmdshell @cmdline

此过程在从SQL Server内部执行时可以正常工作,但在Java中从JDBC调用时则无效。

通过查看活动监视器,我可以看到正在执行该过程的事务正在阻止操作查询"SELECT * FROM ##OutputData"的事务。有效地使该过程陷入僵局。

我玩过代码并且无法理解为什么会发生这种情况。有什么东西我在某处丢失吗?

感谢您的帮助......

编辑:将对Quartz的引用更改为JDBC,因为这可能更相关。

1 个答案:

答案 0 :(得分:0)

我相信我找到了这个问题的答案。

由于Spring使用它自己的事务管理器,它会锁定我在过程中创建的表。 当该过程执行BCP时,它在SQL Server中运行,超出了Spring事务的范围。因此,BCP无法访问所需的表,因为它们被Springs事务锁定。该过程无法继续,因为它正在等待BCP,因此整个过程都会遇到死锁。

我注意到这种情况发生在BCP命令有外部事务的地方,虽然BCP有一个TransactionIsolation标志,但这似乎没有任何影响。

要解决此问题,我现在使用SQL Server作业来运行该过程,没有任何事务。

无论如何,至少我可以感激这个问题为我赢得了“Tumbleweed”徽章;) 谢谢大家!