2010-07-26 22 views
0

我們運行一個用Java編寫的網站,該網站使用JDBC和jTDS訪問SQL Server數據庫。如何在不使用事務的情況下使用JDBC/jTDS執行存儲過程?

我們的數據庫包含一個複雜的存儲過程,通常需要10分鐘才能運行。如果我們直接執行它(例如從SQL Server Management Studio),因爲它不在事務中運行,存儲過程可以正常工作。但如果我們使用jTDS執行它,那麼它會鎖定整個網站10分鐘。發生這種情況是因爲jTDS在事務中運行它,因此所有網站請求都處於等待事務完成的狀態。

例如,下面的鎖起來的網站因交易:

Connection connection = DriverManager.getConnection("jdbc:jtds:sqlserver://example/example"); 
CallableStatement callableStatement = connection.prepareCall("exec dbo.procTest"); 
callableStatement.execute(); 

有沒有我們可以運行使用JDBC/JTDS沒有它在一個事務中運行存儲過程什麼辦法?

請注意,調用此的JTDS連接上是無效的:

connection.setTransactionIsolation(Connection.TRANSACTION_NONE); 

拋出異常,指出Connection.TRANSACTION_NONE參數不受JTDS支持。


編輯:我可能問更好的問題:核心問題不是交易本身,問題是,事務中保持10分鐘數據庫鎖。我需要擺脫交易,或者我需要在交易期間發佈的鎖。

+2

「不在交易中運行」?你確定? AFAIK每個SQL語句都在一個事務中運行。最接近「無事務」的可能是自動提交,每個語句都在自己的會話中執行。 – 2010-07-26 08:38:20

+0

我可以用實際的術語解釋我的意思:如果我運行「EXEC dbo.procTest;」使用SQL Server Management Studio,那麼網站不會鎖定。但是如果我運行「BEGIN TRANSACTION; EXEC dbo.procTest; COMMIT;」那麼該網站在事務期間鎖定 - 監視數據庫鎖定表明網站連接都在執行該存儲過程的線程上等待。 也許交易不是這裏的關鍵。另一種我能說的方式是「我不希望數據庫在交易期間鎖定更新的對象」。 – gutch 2010-07-27 00:00:07

+0

你嘗試過'連接嗎?TRANSACTION_READ_UNCOMMITTED'? – nilskp 2011-04-25 17:22:43

回答

0

我結束了使用下面醜陋的解決方法。如果有人能夠解釋我如何正確地做到這一點,我仍然感興趣;但解決方法暫時可以實現。

數據庫在網絡服務器上的同一臺計算機上運行,​​因此我可以使用標準的SQL Server命令行工具來運行存儲過程。 Java代碼來觸發它:

try { 
     Process process = Runtime.getRuntime().exec("sqlcmd -E -d \"example\" -Q \"EXEC dbo.procTest;\""); 
     process.waitFor(); 
    } catch (IOException e) { 
     // Handler here 
    } catch (InterruptedException e) { 
     // Handler here 
    } 

所以完全相同的存儲過程運行 - 不同的是,Web服務器不鎖定,因爲SQLCMD不是在一個事務中運行它。是的,這很醜陋,但這是我知道的唯一選擇!

0

致電Connection#close()Connection#commit()應提交併結束交易。您是否在finally區塊中關閉了像Connection這樣的DB資源?

+0

是的,Connection#close()和Connection#commit()提交併結束事務......這不是我遇到的問題。問題是,在到達這些線路之前,我們有一個長達10分鐘的交易鎖定了一切。所以這不是一個交易是否被正確提交的問題,這是一個問題,我是否可以避免在交易中首先運行它。 – gutch 2010-07-27 06:59:45

相關問題