programing

Ebean - 동적 쿼리 - 준비된 문의 불일치 매개 변수 개수 오류

codeshow 2023. 8. 30. 22:18
반응형

Ebean - 동적 쿼리 - 준비된 문의 불일치 매개 변수 개수 오류

저보다 더 많은 Ebean 전문 지식을 가진 사람이 제가 지금 해결하고 있는 불규칙한 문제를 해결하는 데 도움을 줄 수 있기를 바랍니다.

환경:

  • Java 1.7.0_17
  • MySQL 5.5
  • Play Framework 2.1.1(그러나 Play 2.2.1로 업그레이드했지만 이 문제는 여전히 존재함)

제 주요 문제는 Play를 다시 시작할 때 SQL 예외가 번갈아 발생한다는 것입니다. 이 모든 것은 Ebone이 만들고 있는 준비된 문의 매개 변수가 너무 많거나 너무 적은 것과 관련이 있습니다.데이터 세트 A는 데이터 세트 B가 실패할 때 절반이 작동하지만 재생을 다시 시작하면 데이터 세트 B는 작동하고 데이터 세트 A는 실패합니다.

함수에 전달된 필터 개체 집합을 기반으로 동적으로 EbeanQuery 개체를 만들고 있습니다.Ebean Query는 각 필터의 지정된 요구 사항을 충족하는 모든 개체를 찾는 중입니다.

이 기능은 다음과 유사합니다.

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에서 지원됩니까?대부분의 경우 이 작업이 가능하지만 특정 데이터를 사용하여 "연락처 가져오기" 기능을 수백 번 실행하는 데 문제가 발생하지만 가끔만...

그러니 이 문제는 매우 혼란스러우니 저와 함께 하세요.또한 데이터가 실제로 무엇인지에 대한 대부분의 세부 정보를 자세히 살펴보겠지만, 더 많은 정보가 필요하거나 필요한 경우 문의하십시오.

데이터 집합 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에서 준비된 문을 사용하여 비슷한 것을 보았습니다.쿼리는 처음 실행된 문에 포함된 매개 변수의 수에 대해서만 작동했습니다.처음 호출되었을 때 사용된 매개 변수의 수 또는 그 이하만 작동합니다.아마도 매개 변수에 대한 버퍼를 확보했을 것입니다. 추가 매개 변수가 존재하지 않는 것처럼 작용했다고 생각합니다.

첫 번째 호출에 충분한 매개 변수가 있으면 해당 매개 변수 수를 초과할 때까지 모든 것이 정상입니다.그러나 첫 번째 쿼리에 하나의 매개 변수만 있고 다음 호출에 둘 이상의 매개 변수가 있는 경우 다음 실행이 즉시 실패할 수 있습니다.

준비된 문 대신 정규 문으로 작동하는지 확인합니다.그렇다면 변수 개수에 대한 준비된 문 처리의 오류가 원인일 수 있습니다.

Tags() 배열 목록에 null 값이 있습니다. 코드를 디버그하면 태그 배열에 null 값이 있음을 알 수 있습니다.

언급URL : https://stackoverflow.com/questions/20501591/ebean-dynamic-query-prepared-statements-mismatched-parameter-count-error

반응형