jdbc查詢sybase引數過多問題

2021-06-22 03:31:21 字數 1306 閱讀 4942

公司的資料庫一直是sybase,用起來也挺好的,最新客戶現場出現乙個問題,資料無法傳輸了,看日誌非常簡單,一下就定位到了原因。

很簡單,引數超過了2000個,因為這個功能是根據主表的主鍵查詢子表,方法用的是where 主表id in (?,?,?,?……)方式,引數問號最多是是2000個,不過這就奇怪了,直接使用sql查詢sybase,5000個引數也沒問題,看來是jdbc驅動的問題了。

我們公司用sybase也有十多年了,這方面還是很有研究的,請教了幾個人,jdbc連線sybase的驅動之前用官方的jconn,後來因為儲存大物件時有個bug,後來統一換成了jtds的驅動,jtds驅動引數是有限制,我又在本地試了試兩個驅動:

jconn,我本地環境中,引數可以超過2000,最多4096個,再多就報錯:

顯然sybase把in(?,?)這種看成使用or了,每個表示式限制是1024個,不過不知道為啥我這最大是4096,但是讓現場更換驅動後,現場環境最多1024個,超過1024就報上面的錯誤,又請請教了幾個人,他們都知道有這個限制,可能和具體環境有關,但什麼關係也沒人能說出來。

jtds驅動比較簡單,引數不能超過2000個,超過就會報錯。

後來網上查了查,dbaspot裡面有個人也碰到這個問題,有人告訴他可以使用下面命令檢視伺服器的限制:

dbcc traceon(3604)

dbcc serverlimits

結果現場環境情況如下,表示式最多4096,and/or最多1024個:

知道限制大小了就好辦,現場問題解決辦法,先把一部分資料挪到其他表中,然後剩下資料量較小,sql是可以支援的,這些資料傳輸完畢後,再把資料挪回來,再傳輸,一點點的弄,最終解決了問題。**中也修改了,由於介面已經固定,不能修改太多,所以只使用大量主表id查詢子表的方法,查詢前拆分一下這些id,每800個(可配置)查詢一次,多查幾次就行了。

問題是解決了,但是根據實際情況不會出現這種問題,平均幾十個就發一次,為什麼攢了這麼多呢,檢視日誌發現是ftp空間滿了,檔案上傳到ftp報錯,導致資料庫狀態沒有更新,就這麼一直卡住了,攢了乙個月的資料,後來ftp擴容了,但是資料太多就傳送失敗了。可見,真實環境什麼情況都有,什麼都可能發生,開發時考慮不全面真能引起不少問題呀。

php函式引數過多 PHP方法引數過多優化方案

我們在編寫php方法時,通常有若干個引數,就像下面的 class book public function create name,cateid,author params name name,cateid cateid,author author 沒有任何問題。但是,隨著業務的發展,引數可能會不斷...

springboot請求引數過大

當在springboot web專案中,如果請求引數為檔案的base64字串,預設情況下,會出現請求頭過大,報錯。解決方法 配置以下四個引數 指定上傳檔案的最大檔案大小,預設為1mb spring.servlet.multipart.max file size 200mb 指定在檔案上傳或表單請求中...

ThinkPhp輸入引數過濾

i id 0 獲取id引數 自動判斷get或者post,不存在時返回預設值0 i post.name htmlspecialchars 獲取 post name i get.獲取 get 使用系統內建的i函式是避免輸入資料出現安全隱患的重要手段,i函式預設的過濾方法是htmlspecialchars...