簡體   English   中英

java中的executeUpdate()需要很長時間才能執行

[英]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

但是,我認為在你的情況下,這不是你的問題的原因。 當簡單的更新掛起時,幾乎總是這些原因之一:

  1. 該行被另一個事務鎖定。
  2. 您正在將另一個表引用的密鑰更新為未編制索引的外鍵
  3. 該表有一個ON UPDATE觸發器,可以完成很多工作。

我很確定你是第一種情況。 出於一致性原因,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM