2012-03-24 12 views
8

मैं अलग CUSTOMER_ID के आधार पर क्वेरी करने के लिए उच्च प्रदर्शन, उदाहरण के लिए एसक्यूएल बैच क्वेरी डीबी क्या करना चाहते हैं:JDBC बैच क्वेरी

select order_id, 
     cost 
from customer c 
    join order o using(id) 
where c.id = ... 
order by 

मैं कैसे JDBC कथन का उपयोग यह करने के लिए यकीन नहीं है। मुझे पता है कि मैं इस उद्देश्य के लिए संग्रहीत प्रक्रिया का उपयोग कर सकता हूं, लेकिन अगर मैं एसपी के बजाए जावा ऐप में एसक्यूएल लिख सकता हूं तो यह बेहतर होगा।
मैं अपने जावा क्लाइंट और MySQL डीबी के लिए डीबीसीपी का उपयोग कर रहा हूं।

+1

"बैच क्वेरी" के साथ आपका क्या मतलब है? आप एक से अधिक ग्राहक प्राप्त करने के लिए 'c.id में (...)' का उपयोग कर सकते हैं। –

+0

मुझे नहीं पता कि "ग्राहकों के लिए एकाधिक परिणाम सेट" के साथ आपका क्या मतलब है। –

+0

@a_horse_with_no_name मेरा मतलब है एक परिणाम के लिए एक परिणाम सेट, वापसी पंक्तियों को मिश्रण न करें। – superche

उत्तर

8

JDBC Specification 4.0 बैच के अपडेट के लिए एक तंत्र का वर्णन है। इस प्रकार, जेडीबीसी में बैच सुविधाओं को सम्मिलित या अद्यतन उद्देश्यों के लिए उपयोग किया जा सकता है। यह विनिर्देश के अध्याय 14 में वर्णित है।

AFAIK चुनिंदा बैचों के लिए कोई तंत्र नहीं है, संभवतः क्योंकि इसके लिए कोई स्पष्ट आवश्यकता नहीं है, क्योंकि अन्य लोगों ने सिफारिश की है, आप बस अपनी क्वेरी को सही ढंग से तैयार करके सभी पंक्तियों को पुनर्प्राप्त कर सकते हैं।

int[] ids = { 1, 2, 3, 4 }; 
StringBuilder sql = new StringBuilder(); 
sql.append("select jedi_name from jedi where id in("); 
for (int i = 0; i < ids.length; i++) { 
    sql.append("?"); 
    if(i+1 < ids.length){ 
     sql.append(","); 
    } 
} 
sql.append(")"); 
System.out.println(sql.toString()); 

try (Connection con = DriverManager.getConnection(...)) { 

    PreparedStatement stm = con.prepareStatement(sql.toString()); 
    for(int i=0; i < ids.length; i++){ 
     stm.setInt(i+1, ids[i]); 
    } 

    ResultSet rs = stm.executeQuery(); 
    while (rs.next()) { 
     System.out.println(rs.getString("jedi_name")); 
    } 

} catch (SQLException e) { 
    e.printStackTrace(); 
} 

आउटपुट

select jedi_name from jedi where id in(?,?,?,?) 
Luke, Obiwan, Yoda, Mace Windu 

वहाँ किसी भी कारण है कि आप पर विचार करेगा कि आप एक बैच का चयन करें बयान की तरह एक बात की जरूरत है?

+1

में समेकित किया जा सकता है मेरा वर्तमान सिद्धांत यह है कि चयन के लिए (उदाहरण के लिए परिणामसेट के साथ) वे" ऑटो बफर " "अगली कुछ पंक्तियां जैसे आप जाते हैं, इसलिए वे चयन के लिए मुफ्त में" बैच "होते हैं। FWIW – rogerdpack

+1

@rogerdpack क्या आपका मतलब है [fetchSize] (http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#setFetchSize-int-) संपत्ति? यह शायद काम करता है, हालांकि दस्तावेज़ीकरण बताता है कि डेटाबेस के लिए सिर्फ एक संकेत हो सकता है। यह सभी ड्राइवरों को जरूरी नहीं है कि इसे लागू करें। –

+0

हे, यह है, लिंक के लिए धन्यवाद! अनुयायियों के लिए, पोस्टग्रेस के साथ आपको ऑटोकॉमिट ऑफ (अजीब) की भी आवश्यकता है: http://stackoverflow.com/questions/1468036/java-jdbc-ignores-setfetchsize – rogerdpack

0

यह वास्तव में कोई फर्क नहीं पड़ता कि आपका एसक्यूएल कथन क्या है (आप अपने डीबी को संभालने के रूप में कई घोंसला वाले जोड़ों का उपयोग कर सकते हैं)। नीचे मूल जावा उदाहरण है (डीबीसीपी नहीं)। डीबीसीपी उदाहरण के लिए जो बहुत समान है, आप उनके example देख सकते हैं।

Connection connect = DriverManager.getConnection(YOUR_CONNECTION_STRING); 
// Statements allow to issue SQL queries to the database 
Statement statement = connect.createStatement(); 

ResultSet resultSet = statement.executeQuery("select order_id, cost 
               from customer c 
               join order o using(id) 
               where c.id = ... 
              order by"); 
+1

मैं बैच क्वेरी करना चाहता हूं जिसका मतलब है कि एक डीबी क्वेरी के लिए कई परिणाम प्राप्त करना, एसक्यूएल स्टेटमेंट जैसे: ऑर्डर_आईडी का चयन करें, ग्राहक सी से ऑर्डर करें ओ (आईडी) का उपयोग करें, जहां c.id = 123 ऑर्डर करें; ऑर्डर_आईडी का चयन करें, ग्राहक से लागत सी ऑर्डर में शामिल हों (आईडी) जहां c.id = 456 ऑर्डर; – superche

+0

आप किसी भी एसक्यूएल कथन को खिला सकते हैं जो 'executeQuery() 'BTW के लिए तर्क के रूप में संकलित करता है: आपके उदाहरण में 2 प्रश्नों को एक – aviad

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