2013-03-20 2 views
0

Проблема:Ограничения MySQL JDBC

я получаю большой ResultSet из БД (MySQL) (более 1 000 000 строк) и обрабатывать каждую строку около 40 секунд. Сводка, я работаю с ResultSet более 30 минут, я получаю меньше записей, чем действительно содержаться в таблице базы данных, и не имеет ошибок и никаких ограничений. Если я подсчитываю количество строк этого ResultSet, все в порядке (количество ResultSet = количество БД).

Есть ли некоторые ограничения на mysql-сервер или драйвер mysql jdbc или что-то еще?

Мой код. она работает в весеннем рамках:

public void query(String query, RowCallbackHandler rowCallbackHandler) throws SQLException { 
    ResultSet rs = null; 
    ResultSet rsCount = null; 
    Statement stmt = null; 
    Statement stmtCount = null; 
    try { 
     stmt = createStatmant(); 

     rs = stmt.executeQuery(query); 

     if (rs == null) { 
      log.info("result set is null"); 
     } 

     stmtCount = createStatmant(); 
     rsCount = stmtCount.executeQuery(query); 
     int i = 0; 
     while(rsCount.next()){ 
      i++; 
     } 
     log.info("ResultSet size : "+i); 

     int j = 0; 
     rs.next(); 
     do{ 
      j++; 
      rowCallbackHandler.processRow(rs); 
     }while (rs.next()); 
     log.info("ResultSet size real : "+i); 
     log.info("ResultSet size fact : "+j); 
    } catch (SQLException e) { 
     throw new RuntimeException(e.getMessage()); 
    }finally{ 
     if(stmt!=null){ 
      stmt.close(); 
     } 
     if(rs!=null){ 
      rs.close(); 
     } 
     if(rsCount!=null){ 
      rsCount.close(); 
     } 
    } 
    } 

createStatment:

private Statement createStatmant() throws SQLException { 

    ((BasicDataSource)dataSource).setTimeBetweenEvictionRunsMillis(1000*60*60); 
    Statement stmt = dataSource.getConnection().createStatement(
      ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
    stmt.setFetchSize(fetchSize); 
    stmt.setMaxRows(50000000-1);  
    return stmt; 
}  

DataSource является глобальная переменная в классе:

private javax.sql.DataSource dataSource; 
+3

Вставьте свой код, пожалуйста, так легко определить проблему. –

+0

Это похоже на проблему в вашем коде. –

ответ

0

Вы вручая изменяемый объект, Р.С., обратно в CallbackHandler , Убедитесь, что это не продвижение или закрытие ResultSet.

Вы объявляете четыре объекта, которые можно закрыть в верхней части вашего метода, но только закрыть три внизу. Не забудьте закрыть stmtCount.

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

1 миллион рядов раз 40 секунд = 40 миллионов секунд = 463 дня. Математика не поддерживает утверждение о том, что вы «обрабатываете каждую строку около 40 секунд».

Есть ли что-либо внешнее письмо в базу данных, когда вы читаете?

Если вы можете сравнить количество баллов из своего журнала, это означает, что вы не выбрали исключение. Это полезная подсказка.

+0

Спасибо за ваш ответ. да, в моем вопросе и коде есть ошибки. Вы правильно думаете о времени. 10 000 рядов обрабатываются через 40 секунд. я исправил код и удалил много ненужных вещей. Это не решение, но теперь все работает нормально. – San4o