java.sql.SQLException問題解決以及注意事項(xiàng)
一、Bug描述
今天做項(xiàng)目開發(fā)的時(shí)候,發(fā)現(xiàn)了這個(gè)Bug,話不多說,直接定位Bug原理+解決!
java.sql.SQLException:
java.lang.RuntimeException: java.sql.SQLException: Can not issue executeUpdate() for SELECTs
at com.infuze.service.subscription.workflow.SyncSubscriptionTrackerWorkflow.executeProcess(SyncSubscriptionTrackerWorkflow.java:130)
at com.infuze.service.workflow.WorkflowExecutor.execute(WorkflowExecutor.java:24)
at com.infuze.service.subscription.xml.SubscriptionXmlService.syncTracker(SubscriptionXmlService.java:140)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at Caused by: java.sql.SQLException: Can not issue executeUpdate() for SELECTs
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2373)二、定位報(bào)錯(cuò)點(diǎn)
ps.executeUpdate(); // problem is here
發(fā)現(xiàn)好問題的報(bào)錯(cuò)后,就可以解決了。
三、解決方案
ps.execute(); //代替ps.executeUpdate
四、注意事項(xiàng)及原理
Statement 接口提供了三種執(zhí)行 SQL 語句的方法:executeQuery、executeUpdate 和 execute。
使用哪一個(gè)方法由 SQL 語句所產(chǎn)生的內(nèi)容決定。
方法executeQuery用于產(chǎn)生單個(gè)結(jié)果集的語句,例如 SELECT 語句。 被使用最多的執(zhí)行 SQL 語句的方法是 executeQuery。這個(gè)方法被用來執(zhí)行 SELECT 語句,它幾乎是使用最多的 SQL 語句。
方法executeUpdate:用于執(zhí)行 INSERT、UPDATE 或 DELETE 語句以及 SQL DDL(數(shù)據(jù)定義語言)語句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 語句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一個(gè)整數(shù),指示受影響的行數(shù)(即更新計(jì)數(shù))。對(duì)于 CREATE TABLE 或 DROP TABLE 等不操作行的語句,executeUpdate 的返回值總為零。
使用executeUpdate方法是因?yàn)樵?createTableCoffees 中的 SQL 語句是 DDL (數(shù)據(jù)定義語言)語句。創(chuàng)建表,改變表,刪除表都是 DDL 語句的例子,要用 executeUpdate 方法來執(zhí)行。你也可以從它的名字里看出,方法 executeUpdate 也被用于執(zhí)行更新表 SQL 語句。實(shí)際上,相對(duì)于創(chuàng)建表來說,executeUpdate 用于更新表的時(shí)間更多,因?yàn)楸碇恍枰獎(jiǎng)?chuàng)建一次,但經(jīng)常被更新。
方法execute用于執(zhí)行返回多個(gè)結(jié)果集、多個(gè)更新計(jì)數(shù)或二者組合的語句。
execute方法應(yīng)該僅在語句能返回多個(gè)ResultSet對(duì)象、多個(gè)更新計(jì)數(shù)或ResultSet對(duì)象與更新計(jì)數(shù)的組合時(shí)使用。當(dāng)執(zhí)行某個(gè)已存儲(chǔ)過程 或動(dòng)態(tài)執(zhí)行未知 SQL 字符串(即應(yīng)用程序程序員在編譯時(shí)未知)時(shí),有可能出現(xiàn)多個(gè)結(jié)果的情況,盡管這種情況很少見。
因?yàn)榉椒?execute 處理非常規(guī)情況,所以獲取其結(jié)果需要一些特殊處理并不足為怪。例如,假定已知某個(gè)過程返回兩個(gè)結(jié)果集,則在使用方法 execute 執(zhí)行該過程后,必須調(diào)用方法 getResultSet 獲得第一個(gè)結(jié)果集,然后調(diào)用適當(dāng)?shù)?getXXX 方法獲取其中的值。要獲得第二個(gè)結(jié)果集,需要先調(diào)用 getMoreResults 方法,然后再調(diào)用 getResultSet 方法。如果已知某個(gè)過程返回兩個(gè)更新計(jì)數(shù),則首先調(diào)用方法getUpdateCount,然后調(diào)用 getMoreResults,并再次調(diào)用 getUpdateCount。
對(duì)于不知道返回內(nèi)容,則情況更為復(fù)雜。如果結(jié)果是 ResultSet 對(duì)象,則方法 execute 返回 true;如果結(jié)果是 Java int,則返回 false。如果返回 int,則意味著結(jié)果是更新計(jì)數(shù)或執(zhí)行的語句是 DDL 命令。在調(diào)用方法 execute 之后要做的第一件事情是調(diào)用 getResultSet 或 getUpdateCount。調(diào)用方法 getResultSet 可以獲得兩個(gè)或多個(gè) ResultSet 對(duì)象中第一個(gè)對(duì)象;或調(diào)用方法 getUpdateCount 可以獲得兩個(gè)或多個(gè)更新計(jì)數(shù)中第一個(gè)更新計(jì)數(shù)的內(nèi)容。
當(dāng) SQL 語句的結(jié)果不是結(jié)果集時(shí),則方法 getResultSet 將返回 null。這可能意味著結(jié)果是一個(gè)更新計(jì)數(shù)或沒有其它結(jié)果。在這種情況下,判斷 null 真正含義的唯一方法是調(diào)用方法 getUpdateCount,它將返回一個(gè)整數(shù)。這個(gè)整數(shù)為調(diào)用語句所影響的行數(shù);如果為 -1 則表示結(jié)果是結(jié)果集或沒有結(jié)果。如果方法 getResultSet 已返回 null(表示結(jié)果不是 ResultSet 對(duì)象),則返回值 -1 表示沒有其它結(jié)果。
總結(jié):寫在后面的話
到此這篇關(guān)于java.sql.SQLException問題解決以及注意事項(xiàng)的文章就介紹到這了,更多相關(guān)java.sql.SQLException問題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mysql字符集引起的java.sql.SQLException:Incorrect?string?value:問題
- java.sql.SQLException:?connection?holder?is?null錯(cuò)誤解決辦法
- Java中java.sql.SQLException異常的正確解決方法(親測(cè)有效!)
- java報(bào)錯(cuò)Cause: java.sql.SQLException問題解決
- java.sql.SQLException: 內(nèi)部錯(cuò)誤: Unable to construct a Datum from the specified input
- java.sql.SQLException異常原因排查與解決
相關(guān)文章
Java動(dòng)態(tài)顯示文件上傳進(jìn)度實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Java動(dòng)態(tài)顯示文件上傳進(jìn)度實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
SpringCloud融入Python的實(shí)現(xiàn)
這篇文章主要介紹了SpringCloud融入Python的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
詳解Spring框架之基于Restful風(fēng)格實(shí)現(xiàn)的SpringMVC
這篇文章主要介紹了詳解Spring框架之基于Restful風(fēng)格實(shí)現(xiàn)的SpringMVC,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
java8中parallelStream性能測(cè)試及結(jié)果分析
本篇文章給大家用代碼實(shí)例做了segmentfaultjava8中parallelStream性能測(cè)試,并對(duì)測(cè)試結(jié)果做了說明,需要的朋友學(xué)習(xí)下吧。2018-01-01
SpringBoot中Redisson延遲隊(duì)列的示例
延時(shí)隊(duì)列是一種常見的需求,延時(shí)隊(duì)列允許我們延遲處理某些任務(wù),本文主要介紹了Redisson延遲隊(duì)列的示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06

