測試環境部署之填坑記錄-Expected one result (or null) to be returned by selectOne(), but found: 2

最近在部署性能測試環境的時候,環境 部署好之後,部分功能出現接口查詢異常,問題現象:前端

拿到錯誤,確定要先判斷是前端仍是後端代碼的問題,最簡單的方式是抓包查看:java

以上是報錯頁面捕獲的接口報錯,很明顯的接口已經報錯了,那麼就直接查看後端的日誌:mysql

查看日誌分兩步:web

1.查看網關web端的日誌:spring

從日誌能夠知道,出錯的地方在selectOrgDetail接口查詢上sql

com.xxx.postlend.debtmanagement.service.org.impl.OrgServiceImpl.selectOrgDetail(OrgServiceImpl.java:42)數據庫

2.繼續查看APP服務端的日誌報錯:apache

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException:後端

nested exception is org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2mybatis

你想查詢一條數據,可是從數據庫返回兩條數據

看到這個錯誤,就知道是查詢數據庫的記錄,查詢到2條,而指望的結果是1條,即selectOne函數的查詢結果,致使報錯

 

到這個錯誤的緣由就是由於你的查詢方法中獲得兩個兩個結果集,然而你的返回用了一個實體去接收,程序這個時候就不知道如何去分配了,很果斷的報這個錯,

 

修改方法爲使用一個list來接收就沒有問題了。

 

其實從這個selectOne方法也能夠猜出來

 

指望selectOne()返回一個結果(或null),但找到:2

 

而後我就看了下dao層的接口 是Office getOffice(id); 查的是一條數據,可結果返回的是2條數據的結果集。固然報錯咯!

 

解決方法是將接口改成list

 

List<Office>getOffice(String id);

 

mybatis和spring整合後,dao中的接口
public Student getUser(Student userStudent);

會自動選擇selectOne()方法,因爲只能返回一個對象的結果,當返回到多個對象的結果集時報錯。getUser是一個student類的bean沒法接受多個結果集,則改用List就能夠接受多個結果集

將dao中的
public Student getUser(Student userStudent);

改成
import java.util.List;
public List<Student> getUser(Student userStudent);

 

從日誌報錯的信息查看,問題出如今APP端的代碼以下:

at com.xxx.postlend.debtoauth2.service.biz.impl.OrganizationServiceImpl.selectOrgDetailInfo(OrganizationServiceImpl.java:217)

經過代碼查看,這個selectOne查詢方式是mybatis框架的自動生成sql查詢語句,因此沒法查看具體的sql mapper映射文件

須要經過監控,這個接口執行的全部sql以下:

拿到上述的sql去mysql客戶端工具裏執行驗證一下,查看是否存在主鍵查詢出現兩條記錄的sql

果真發現存在2個orgId致使的報錯,刪除兩個記錄中的一個

問題完美解決

經過這個例子,其實你們在測試過程當中確定會碰見各類各樣的環境問題,當出現問題的時候,首先判斷問題的類型

而後經過web端仍是app端的問題,經過日誌打印的堆棧,以及查看代碼的方式,尋找問題的出現的緣由,這樣才能慢慢的提高

相關文章
相關標籤/搜索