2011-01-05 6 views
0

テーブルデータをテキストファイルにダンプする手順を記述しました(関連する変数が宣言されていると仮定します)。JDBCから呼び出されたときにBCPを使用してテーブルデータをファイルにダンプできない

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

SET @cmdline = 'bcp '+ @sql +' queryout '[email protected]+'\outputFile.csv -c -t -T -S' + @@ServerName 

EXEC master..xp_cmdshell @cmdline 

この手順では、SQL Serverの内部から実行すると正常に動作しますが、それはJavaでJDBCから呼び出されていないとき。

アクティビティモニタを見ると、クエリ"SELECT * FROM ##OutputData"を操作しているトランザクションが、プロシージャを実行しているトランザクションによってブロックされていることがわかります。効果的にプロセスをデッドロックします。

私はコードを使いこなしていますが、なぜこのことが起こるのかわかりません。どこかで行方不明のものがありますか?任意の助け

おかげで...

EDITは:それはおそらくより関連性のため、代わりにJDBCにクォーツへの参照を変更しました。

答えて

0

私はこの問題の答えを見つけたと思います。

Springは独自のトランザクションマネージャを使用しているので、プロシージャで作成しているテーブルをロックしています。 このプロシージャはBCPを実行するときに、Springトランザクションの範囲外でSQL Serverで実行されます。したがってBCPはSpringトランザクションによってロックされるため、必要なテーブルにアクセスできません。 BCPで待機しているため、プロセス全体がデッドロック状態になるため、この手順を続行できません。

これは、BCPコマンドに外部トランザクションがある場合に発生し、BCPにTransactionIsolationフラグが設定されている場合に発生することに気付きましたが、このインスタンスには何の効果もないようです。

問題を解決するために、SQL Serverジョブを使用して、トランザクションを実行しないでプロシージャを実行しています。

とにかく、少なくとも私はこの質問が私に「タンブルウィード」バッジを与えてくれたことに感謝することができます;) ありがとう!

関連する問題