2015-06-08 3 views
0

Использование Java с JDBC
Запрос данных из базы данных postgres, в которой хранится информация о судне.
Я создаю объект судна из данных и добавляю координатные данные в список координат объекта судна.
Как выполнить итерацию с большой таблицей

ResultSet rs = stmt.executeQuery("SELECT mmsi, report_timestamp, position_geom, ST_X(position_geom) AS Long, "+ 
       "ST_Y(position_geom) AS Lat FROM reports3 WHERE position_geom IS NOT NULL ORDER by report_timestamp ASC"); 

TreeMap <Long, Vessel> vessels = new TreeMap<Long, Vessel>(); 
        long startTime2 = System.nanoTime(); 

        while(rs.next()){ 
         long mmsi = rs.getLong("mmsi"); 
         java.util.Date time = rs.getTime("report_timestamp"); 
         double longitude = rs.getDouble("Long"); 
         double latitude = rs.getDouble("Lat"); 
         Coordinate coordinate = new Coordinate(longitude, latitude, time); 
         Vessel vessel = new Vessel(mmsi); 

         if(!vessels.containsKey(mmsi)) { //if vessel is not present in vessels 
          vessel.addCoor(coordinate); 
          vessels.put(mmsi, vessel); 
         } 
         else { //if vessel is already in vessels 
          vessels.get(mmsi).addCoor(coordinate); 
         } 
        } 

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

Мне интересно, как проходить через базу данных, запросив 1000 000 строк за раз с каждой итерацией. У меня будет достаточно информации для запуска некоторых методов и хранения важных ключей, затем очистите карту деревьев сосудов и запустите следующие 1 000 000 строк ,

+1

Первое, что вам нужно сделать, это настроить драйвер, чтобы не буферизовать полный результат в памяти: https://jdbc.postgresql.org/documentation/94/query.html#query -with-cursor –

+0

** Невозможно сохранить много объектов судна на моей машине ** - Если это ваша настоящая проблема ... тогда почему бы не определить требуемые операции в хранимой процедуре и после этого получить ограниченные данные. – Rajesh

ответ

0

Попробуйте использовать метод setFetchSize(int). Подробнее об этом link

+0

Эта ссылка касается драйвера SQL Server JDBC, который ведет себя иначе, чем драйвер JDBC Postgres. –

+0

Я использовал его для баз данных Oracle и MySQL, и он решил ту же проблему. –

+0

Ну, для Oracle и MySQL с использованием 'setFetchSize()' не обязательно начинать, потому что эти драйверы вначале не считывают полный набор результатов в память. А для Postgres это будет иметь эффект, если автокоммит отключен. Для драйвера Microsoft вам нужно использовать 'selectMethod = cursor' и для драйвера jTDS вам нужно использовать' useCursors = true', чтобы избежать буферизации всего результата. –

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