2012-05-21 63 views
1

我有以下查詢:下面的簡單查詢沒有完成。預處理語句

String updatequery = "UPDATE tbl_page SET linkCount = ?, pageProcessed = 1 WHERE pageUrl =?"; 
PreparedStatement updatestmt = kon.prepareStatement(updatequery); 
updatestmt.clearParameters(); 
//updatestmt.setQueryTimeout(10); 
updatestmt.setInt(1, linkCount); 
updatestmt.setString(2, urlLink); 
updatestmt.executeUpdate(); 

當我設置爲10秒查詢超時就會捕捉異常查詢超時。但是當我不這樣等待。查詢有什麼問題? pageUrl列是主鍵與varchar(900)

我知道準備的語句可能是錯誤的,因爲當我在MS SQl服務器管理工​​作室('?'取代它的值)運行此查詢時,它工作正常。

我錯過了Java或MSSQL的東西嗎?

+0

您是否有其他通過JDBC正確運行的查詢? – cheeken

+0

是的只有這個是有問題的。 –

+1

性能方面,大於4的VARCHAR列並不理想。這是我建議使用INT'ID'列作爲主鍵的情況之一,並且在URL列上使用UNIQUE約束 –

回答

1

上PAGEURL創建索引:

create index tbl_page_pageUrl_index on tbl_page(pageUrl); 

,將允許您要更新的行快速訪問。

如果沒有此索引,數據庫必須執行全表掃描,並且與update命令結合使用時,可能導致鎖定爭用甚至可能導致死鎖,具體取決於您的鎖定選項。

+1

我認爲這已經是PK了,他猜測他錯誤地輸入了'urlLink'。 –

+0

抱歉的錯誤。 'pageUrl'是tbl_page –

2

由於代碼看起來很好,這可能是數據庫端的問題。可能是其他人通過更新它而不是執行提交/回滾(最有可能來自MS-SQL Server Management Studio!)來阻止該行。您可以查找其他進程擁有的相同記錄的鎖,以確保這不是數據庫問題。

+0

中的PK謝謝。連接對象在其他類中未關閉。 –