2013-12-10 6 views
15

मैं उम्मीद कर रहा हूं कि अधिक से अधिक ईबीन विशेषज्ञता वाले किसी व्यक्ति को मुझे एक अनियमित समस्या से मदद मिल सकती है, अब मैं समस्या निवारण कर रहा हूं।ईबीन - गतिशील क्वेरी - तैयार वक्तव्य की बेमेल पैरामीटर गणना त्रुटि

पर्यावरण:

  • जावा 1.7.0_17
  • MySQL 5.5
  • प्ले फ्रेमवर्क 2.1.1 (हालांकि मैं 2.2.1 प्ले में अपग्रेड किया है और इस समस्या को अभी भी अस्तित्व में)

मेरी मुख्य समस्या यह है कि जब मैं Play को पुनरारंभ करता हूं तो मुझे वैकल्पिक SQLExceptions मिल रहा है, सभी को ईबीन बना रहे तैयार कथन में बहुत अधिक या बहुत कम पैरामीटर के साथ करना है। डेटा सेट एक समय का आधा काम करता है जब डेटा सेट बी विफल रहता है, लेकिन जब प्ले को पुनरारंभ करते हैं, डेटा सेट बी काम करता है जबकि डेटा सेट ए विफल रहता है।

मैं एक फ़ंक्शन में पारित फ़िल्टर ऑब्जेक्ट्स के सेट के आधार पर गतिशील रूप से एक ईबीन क्वेरी ऑब्जेक्ट का निर्माण कर रहा हूं। ईबीन क्वेरी सभी वस्तुओं को ढूंढ रही है जो प्रत्येक फ़िल्टर की दी गई आवश्यकताओं को पूरा करती हैं।

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" फ़ंक्शन को कई सौ बार चलाने में समस्याएं मिलती हैं, लेकिन केवल कभी-कभी ...

तो इस समस्या के रूप में मेरे साथ रहें बेहद उलझन में है। मैं वास्तव में डेटा के बारे में अधिकतर विवरणों पर नजर डालने जा रहा हूं, लेकिन यदि आप अधिक जानकारी चाहते हैं/चाहते हैं, तो कृपया पूछें।

डाटा एक के प्रश्न और अपवाद सेट:

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). 

फिर एक प्ले पुनः प्रारंभ करने पर, डेटा बी के प्रश्न और अपवाद सेट:

[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% समय।

क्या किसी ने कभी ऐसा कुछ देखा है? भ्रम में जोड़ने के लिए, यह अतिरिक्त रूप से हमारे उत्पादन वातावरण पर कुछ समान (विभिन्न डेटा सेटों पर) कर रहा है, लेकिन मैं डेटाबेस को डंप करने और स्थानीय रूप से लोड करने के बाद भी इसे अपने विकास या परीक्षण मशीनों पर पुन: उत्पन्न नहीं कर सकता। हालांकि ऊपर वर्णित समस्या हर जगह पुन: उत्पन्न होती है।

+0

ऐसा लगता है कि यह ईबीन में एक बग है जिसे हम अभी काम कर रहे हैं: https://github.com/ebean-orm/avaje-ebeanorm/issues/60 – jcreason

+0

क्या यह अभी भी एक मुद्दा है? हमें शायद इस सवाल का जवाब देना चाहिए और इसे बंद करना चाहिए। – avgvstvs

+0

मैं इसे हल करने में कभी सक्षम नहीं था, और रॉब से पहले इस मुद्दे के आसपास काम किया था कि रॉबिन ईबेन परियोजना को ठीक कर रहा है। – jcreason

उत्तर

-2

टैग() सरणी सूची में एक शून्य मान है। यदि आप कोड डीबग करते हैं तो आप देख सकते हैं कि टैग सरणी में एक शून्य मान है।

+0

यहां तक ​​कि अगर GetTags() फ़ंक्शन के परिणामस्वरूप शून्य मूल्य था, जो मुझे लगता है कि आप इसका जिक्र कर रहे हैं, तो इसका कारण यह नहीं होता। – jcreason

0

मैंने तैयार बयान का उपयोग करके कुछ समान (डीबी 2 पर) देखा है। क्वर्टीज ने केवल पहले कथन के पैरामीटर की संख्या के लिए काम किया था। केवल पहली बार पैरामीटर की संख्या जो इसे पहली बार बुलाया गया था या कम काम करेगा। यह संभवतः पैरामीटर के लिए एक बफर को अलग करता है - मेरा मानना ​​है कि यह अतिरिक्त पैरामीटर मौजूद नहीं था जैसा कि अस्तित्व में था।

यदि पहली कॉल में पर्याप्त पैरामीटर थे तो सबकुछ ठीक होगा जब तक आप उस पैरामीटर की संख्या से अधिक हिट नहीं करते। लेकिन अगली रन तुरंत विफल हो सकती है अगर पहली क्वेरी में केवल 1 पैरामीटर था और अगली कॉल में एक से अधिक था।

जांचें कि क्या यह एक तैयार कथन के बजाय नियमित विवरण के साथ काम करता है। यदि पैरामीटर की परिवर्तनीय संख्याओं के लिए तैयार किए गए तैयार कथन में कोई त्रुटि संदेह है।

संबंधित मुद्दे