Невозможно выгрузить данные таблицы в файл, используя BCP при вызове из JDBC - PullRequest
0 голосов
/ 05 января 2011

Я написал процедуру для выгрузки данных таблицы в текстовый файл следующим образом (предположим, что соответствующие переменные были объявлены);

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,но не тогда, когда он вызывается из JDBC в Java.

Глядя на монитор активности, я вижу, что транзакция, выполняющая запрос "SELECT * FROM ##OutputData", блокируется транзакцией, которая выполняет процедуру.Эффективная блокировка процесса.

Я поиграл с кодом и не понимаю, почему это вообще произойдет.Есть что-то, что я где-то упускаю?

Спасибо за любую помощь ...

РЕДАКТИРОВАТЬ: Вместо этого ссылки на кварц на JDBC изменены, потому что это, вероятно, более уместно.

1 Ответ

0 голосов
/ 12 января 2011

Мне кажется, я нашел ответ на этот вопрос.

Поскольку Spring использует собственный менеджер транзакций, он блокирует таблицы, которые я создаю в этой процедуре. Когда эта процедура выполняет BCP, она запускается на SQL Server, выходящем за рамки транзакции Spring. Поэтому BCP не может получить доступ к нужным таблицам, поскольку они заблокированы транзакцией Springs. Процедура не может быть продолжена, поскольку она ожидает на BCP, поэтому весь процесс зашел в тупик.

Я заметил, что это происходит везде, где у команды BCP есть внешняя транзакция, и, хотя у BCP есть флаг TransactionIsolation, в данном случае это, похоже, не оказывает никакого влияния.

Для решения этой проблемы я сейчас использую задания SQL Server для запуска процедуры без транзакций.

В любом случае, по крайней мере, я могу быть благодарен за то, что этот вопрос принес мне значок «Плетеный»;) Спасибо всем!

...