2013-09-19 2 views
1

Моей цели заключается в следующем:Как повторно использовать PreparedStatement, который зависит от результата выполнения

У меня есть SELECT запроса с этим я хочу работать на базе данных с большим количеством строк. Этот запрос даст много результатов, поэтому я думал запустить его в итерациях с LIMIT 1000 и OFFSET ?, где ? будет последней строкой, обработанной на каждой итерации.

Например:

  • Получить на строки 1 - 1000
  • Получить строки 1001 - 2000
  • Получить строки 2001 - 3000
  • Получить строки 3001 - 4000
  • ...

Я думал об этом в цикле, где каждая новая итерация будет устанавливать последнюю итерацию в качестве новой итерации OFFSET (например: OFFSET 1001, OFFSET 2001 и т. д., как показано выше).

Я новичок в использовании JDBC, поэтому это правильный способ сделать это? Если да, как я могу повторно использовать PreparedStatement, когда я должен выполнить его и получить результат для каждой итерации?

Если это неправильный способ сделать это, каков правильный путь?

EDIT: Вот мой текущий код:

private static void import(Date from, Date to) throws Exception { 

    PreparedStatement p = connect.prepareStatement(statement); 
    p.setInt(1, 0); 
    p.add 
    ResultSet results; 
    for (int i=0; i< WAVES; i++) { 
     results = p.executeQuery(); 
     Integer lastRow = importFrom(results); 
     p.setInt(1, lastRow.intValue()+1); 
     results.close(); 
    } 
    p.close(); 
} 

EDIT 2: Вот SQL строка:

SELECT 
item.aitem_id, item.action_type, item.user_id, item.pid, item.pr_id, item.action_time, item.notes, item.screen, item.vid, item.lo_id, 
vals.value_name, vals.simple_int_value, vals.simple_double_value, vals.simple_date_value, vals.simple_string_value, 
data.version_id, data.prev_version_id 
FROM mySchema.aitems item 
JOIN mySchema.avalues vals ON item.aitem_id=vals.aitem_id 
JOIN mySchema.adata data ON item.aitem_id=data.aitem_id 
LIMIT 1000 OFFSET ?; 

Я изменил и мой код и SQL для подготовки только с OFFSET.

+0

Не могли бы вы дать полный отбор? – Scadge

+1

Зачем его разделять? Это, скорее всего, более неэффективно, чем получение всех ваших данных сразу. Особенно, если вы разбиваете их на мелкие куски 1000. – dispake

+0

Я хотел разбить его, потому что это БД с живыми данными производства, поэтому я не хотел влиять на производительность. И мой запрос без ограничений создаст около 1,6 миллиона результатов. – Churro

ответ

1

Что вы делаете правильно, но было бы неплохо добавить звонок в clearParameters() и использует блоки try finally. Ниже я расскажу, как это осуществить.

PreparedStatement p = null; 
ResultSet results = null; 
Integer lastRow = 0; 
try 
{ 
    p = connect.prepareStatement(statement); 
    p.add 

    for (int i=0; i< WAVES; i++) 
    { 
     p.clearParameters(); 
     p.setInt(1,lastRow.intValue() + 1) 
     try // This try might not really be necessary 
     { 
      results = p.executeQuery(); 
      Integer lastRow = importFrom(results); 
      p.setInt(1, lastRow.intValue()+1); 
     } // Add dealing with exceptions 
     finally 
     { 
      results.close(); 
     } 
    } 
} //Add dealing with exceptions 
finally 
{ 
    p.close(); 
} 
+0

извините, это опечатка, которая произошла как измененный мой код после вставки его здесь. Я исправил это, но это не решило проблему. Это вызвало ошибку во время выполнения, и я исправил ее. – Churro

+1

Думал, что это была бы опечатка. Так в чем проблема, которую вы получаете? –

+0

Количество результатов, которые я получаю, намного меньше количества строк, которые я получаю, если я выполняю запрос в программе СУБД. – Churro

Смежные вопросы