[英]executeUpdate() in java takes long time to execute
我使用一段簡單的代碼更新Oracle DB中的單行,查詢只更新了一行,但執行仍然掛起在stmt.executeUpdate()上。
它不會拋出任何異常,但控件只是掛在那里。
我迷失在這里,因為同一段代碼早先工作正常。
try {
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
conn = DriverManager.getConnection(url,username,pwd);
stmt = conn.createStatement();
String sql = "update report set status =" +"'"+NO+"'"+ " where name=" +"'"+ name+"'"+ " and user_id=" +"'"+sub+"'";
System.out.println(sql);
stmt.executeUpdate(sql)
你永遠不應該通過連接像這樣的變量來創建語句。 這使您可以打開SQL注入 。 此外,Oracle會將每個語句視為一個新語句,需要進行硬解析,這可能會導致性能問題。 而是使用preparedStatement 。
但是,我認為在你的情況下,這不是你的問題的原因。 當簡單的更新掛起時,幾乎總是這些原因之一:
我很確定你是第一種情況。 出於一致性原因,Oracle會阻止多個用戶同時更新同一行。 這意味着如果修改的行被鎖定,DML語句將等待另一個事務。 它將等待阻塞事務提交或回滾。
我建議你在嘗試通過執行SELECT ... FOR UPDATE NOWAIT
之前更新它之前總是鎖定一行。 如果該行已被鎖定,則會失敗,您可以通過告訴用戶此行當前被另一個會話鎖定而正常退出。
您還必須確保沒有事務以非公共狀態結束。 所有會話應在退出之前提交或回滾其更改(盡管不使用自動提交)。
使用JDBC PreparedStatement java docs
Class.forName("org.apache.derby.jdbc.ClientDriver");
Connection con = DriverManager.getConnection
("jdbc:derby://localhost:1527/testDb","name","pass");
PreparedStatement updateemp = con.prepareStatement
("insert into emp values(?,?,?)");
updateemp.setInt(1,23);
updateemp.setString(2,"Roshan");
updateemp.setString(3, "CEO");
updateemp.executeUpdate();
我遇到了同樣的問題,我不了解別人,但我只是關閉了SQLplus解決了它! 我不認為這可以解決它,因為一些查詢工作,而sqlplus在控制台上運行,但我關閉它,現在每個查詢都工作,沒有任何東西掛起!
如果您遇到問題,可以嘗試這樣做! 在您的控制台或您正在使用的任何其他數據庫上退出Sqlplus,然后再次嘗試運行您的代碼!
請改用PreparedStatement
http://www.mkyong.com/jdbc/jdbc-preparestatement-example-insert-a-record/
如果你聲明那么每次它服務器將檢查語法,所以它消耗時間所以去PreparedStatement
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.