簡體   English   中英

Ebean - 動態查詢 - 准備語句的不匹配參數計數錯誤

[英]Ebean - Dynamic Query - Prepared Statement's Mismatched Parameter Count Error

我希望擁有比我更多Ebean專業知識的人可以幫助我解決我現在正在排除故障的不穩定問題。

環境:

  • Java 1.7.0_17
  • MySQL 5.5
  • Play Framework 2.1.1(但是我已經升級到Play 2.2.1並且這個問題仍然存在)

我的主要問題是當我重新啟動Play時,我正在交替使用SQLExceptions,所有這些都與Ebean正在創建的預准備語句中的參數太多或太少有關。 數據集A在數據集B失敗的情況下工作一半,但在重新啟動Play時,數據集B在數據集A失敗時工作。

我正在根據我寫入傳遞給函數的一組Filter對象動態構建一個Ebean Query對象。 Ebean查詢正在查找滿足每個Filter的給定要求的所有對象。

該功能類似於:

private List<Contact> contacts getContacts(Set<Filter> filters) {
    Query<Contact> query = Contact.find;
    for (Filter filter : filters) {
        filter.apply(query);
    }
    List<Contact> contacts = query.findList();
}

過濾器的示例:

public void apply(Query<Contact> query) {
    query.where().in("tags", getTags());
}

首先,Ebean支持這種類型的查詢構建嗎? 我相信這是因為大多數時候這是有效的,然而,我遇到了使用某些數據運行“getContacts”函數數百次的問題,但有時只是......

所以堅持我,因為這個問題非常令人困惑。 我還將介紹數據實際上的大部分細節,但如果您需要/需要更多信息,請詢問。

數據集A的查詢和異常:

select distinct t0.contact_id c0, t0.contact_uuid c1, t0.bounce c2 
from contact t0
join email_record u1 on u1.contact_id = t0.contact_id 
join contact_tag u2z_ on u2z_.contact_id = t0.contact_id 
join tag u2 on u2.tag_id = u2z_.tag_id  
where u1.status = ?  and t0.unit_id = ?  and u2.tag_id in (?,?,?)  and t0.unit_id in (? )  and t0.campaign_id in (?,?,?,?,?,?,?,?,?,?,?,?)

[PersistenceException: Error with property[19] dt[4]data[1464][java.lang.Integer]]
Caused by: java.sql.SQLException: Parameter index out of range (19 > number of parameters, which is 18).

然后在Play重啟后,數據集B的查詢和異常:

[PersistenceException: Query threw SQLException:No value specified for parameter 19 Bind values:[SENT, 1290, 8988, 13032, 13052, 1290, 96, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 222] Query was: select distinct t0.contact_id c0, t0.contact_uuid c1, t0.bounce c2 from contact t0 join email_record u1 on u1.contact_id = t0.contact_id join contact_tag u2z_ on u2z_.contact_id = t0.contact_id join tag u2 on u2.tag_id = u2z_.tag_id where u1.status = ? and t0.unit_id = ? and u2.tag_id in (?,?) and t0.unit_id in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) and t0.campaign_id in (?,?,?,?,?,?,?,?,?,?,?,?) ]

我覺得最令人困惑的是它如何在重啟時100%可靠地切換。

有沒有人見過這樣的事情呢? 只是為了增加混亂,它還在我們的生產環境中做了非常類似的事情(在不同的數據集上),但即使在轉儲數據庫並在本地加載它之后,我也無法在我的開發或測試機器上重現這一點。 上述問題雖然可以在任何地方重現。

我在使用預處理語句時看到了類似的東西(在DB2上)。 Querties僅適用於執行第一個語句的參數數量。 只有第一次調用或更少的參數數量才有效。 它可能為參數留出了一個緩沖區 - 我相信它的作用就像額外的參數不存在一樣。

如果第一次調用有足夠的參數,那么一切都會好的,直到你擊中超過這個數量的參數。 但是如果第一個查詢只有1個參數而下一個調用有多個參數,則下一次運行可能會立即失敗。

檢查它是否適用於常規語句而不是預准備語句。 如果是這樣,懷疑在准備好的語句中處理可變數量的參數時出錯。

Tags()數組列表中有一個空值。 如果您調試代碼,您可以看到標記數組中有一個空值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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