1.1
問題描述
doma連線mysql資料庫進行分頁時,查詢出來的總資料顯示總是為1(不是想要的資料結果)。介面現象如下:
問題分析
doma呼叫mysql語句時會自動在sql語句中加入sql_calc_found_rows關鍵字,然後配合found_rows()函式的使用,統計出去除limit限制條件的所有資料的總數。語句如下:
select sql_calc_found_rows
rce_message_id,
message_service_id,
message_name,
message_description,
depart_path,
create_time,
createby,
update_time,
updateby,
update_count,
delete_time,
deleteby,
delete_flag
from rce_message_dict
where
delete_flag='0'
order by update_time desc
limit 0, 10
select found_rows()
found_rows()函式統計出的數量是離它最近的一次查詢語句,所以如果在上面的兩條查詢語句之間有其他的查詢語句出現就會導致結果資料不是我們實際想要得到的結果。(結果不對,不代表查詢錯誤)
那麼在執行上面兩條語句之間發生了什麼?
讓我們來看乙個配置檔案:
沒錯這就是資料庫連線池的配置檔案,在配置項有個validationquery配置項,該配置項的作用就是來驗證資料庫連線的有效性。常見的validationquery語句有:
資料庫
validationquery
(僅供參考,並非固定)
oracle
select 1 from dual
db2select 1 from sysibm.sysdummy1
mysql
select 1
microsoft sql
select 1
hsqldb
select 1 from information_schema.system_users
postgresql
select version();
ingres
select 1
derby
select 1 h2
select 1
還有另外乙個配置項testonborrow,就是在進行borrowobject進行處理時,對拿到的connection進行validateobject校驗,判斷其是否有效。
這樣問題就出現了
,在執行select found_rows()語句之前,其實就執行了配置項validationquery中的語句「select 1」,所以返回結果就變成了1。
1.3
解決方法
思路很清楚,只要在執行select found_rows()語句之前不去執行validationquery中的語句就可以了。如何做?
在相應的查詢方法上加上事務,這樣就能保證使用的是同乙個connection,就不會去執行validationquery中的驗證語句了。
最終介面效果:
以上資料僅供參考
Mysql分頁,資料量大時limit優化
mysql的優化是非常重要的。其他最常用也最需要優化的就是limit。mysql的limit給分頁帶來了極大的方便,但資料量一大的時候,limit的效能就急劇下降。同樣是取10條資料 select from order limit 10000,10 select from order limit 0...
nodeJS與MySQL實現分頁資料以及倒序資料
大家在做專案時肯定會遇到列表類的資料,如果在前台一下子展示,速度肯定很慢,那麼我們可以分頁展示,比如說100條資料,每10條一頁,在需要的時候載入一頁,這樣速度肯定會變快了。那麼這裡我給大家介紹如何在nodejs環境中用mysql實現分頁。前面一些必要的配置我先不詳細說了,這裡主要說的是位址池的配置...
Mysql排序分頁查詢兩頁資料重複問題
問題描述 資料分頁時需要根據資料記錄建立時間create time欄位倒序,即使用order by create time desc limit 但是我們會發現,前端進行請求時獲取的資料並不正確,分頁 現了一定的重複資料。問題原因 期初還很好奇,總數沒問題,總查詢也沒問題,為什麼資料會重複了,然後會...