2015-10-19 3 views
1

Я загружаю в таблицу базы данных 8000 записей о пользователях, и я делаю некоторые операции над этими данными, и в конце я хочу получить обратно 8000 записей с балансом. Мой код:ResultSet не возвращает все значения

public void getBalance(String database){ 
    Connection conn=null; 
    Statement stmt=null; 
    ResultSet rs=null; 
    try{ 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
      conn=DriverManager.getConnection(
       "jdbc:oracle:thin:@address","user","password"); 
      stmt=conn.createStatement(); 
      rs=stmt.executeQuery("select count(*) from balance1"); 
      int count=0; 
      while(rs.next()){ 
      count=rs.getInt(1); 
      } 
      System.out.println("The count is "+count); 
      conn.setAutoCommit(false); 
      stmt.setFetchSize(count);  
      rs = stmt.executeQuery("select * from balanceview"); 
      writeToAFile(rs); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    }finally{ 
     if(conn!=null){ 
      try{ 
       conn.close(); 
      }catch(Exception e){ 
       _logger.severe(e.getMessage()); 
       e.printStackTrace(); 
      } 
     }if(stmt!=null){ 
      try{ 
       stmt.close(); 
      }catch(Exception e){ 
       _logger.severe(e.getMessage()); 
       e.printStackTrace(); 
      } 
     }if(rs!=null){ 
      try{ 
       rs.close(); 
      }catch(Exception e){ 
       _logger.severe(e.getMessage()); 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

, но перед лицом проблемы возвращаются только 2000 значений. Есть ли способ вернуть все 8000 значений.

+0

Что такое 'count = rs.getInt (1)' * предполагается * делать? Должно ли это вместо 'count ++'? Я бы также предположил, что 'stmt.setFetchSize (count)' не является невероятной идеей, если у вас нет тонны ОЗУ для этого ... – JonK

+1

Вы выбираете счет из 'balance1', но затем запрашиваете' balanceview' , Это нормально? – Tunaki

+0

Да balance1 - это моя таблица, где хранятся все 8000 клиентов, а balanceview - просто представление, которое содержит простой выбор в таблице balance1. – user3428496

ответ

0

JDBC всегда будет выбирать количество строк по умолчанию (не весь набор результатов) в вашей локальной памяти. Как только вы дойдете до последней строки выбранных строк (скажем, выполнив следующую() и попробуйте получить доступ к следующей строке), и если в результате будет больше строк, тогда в базу данных будет отправлен другой запрос на обратный вызов, чтобы получить следующую пакет строк в локальную память.

Даже вы можете установить количество строк, которые вы хотите извлечь в локальной памяти, чем обычно, вы можете рассмотреть CachedRowSet.

Когда вы устанавливаете функцию fetchSize() в выписке, вы указываете только инструкцию для драйвера JDBC, сколько вы хотите получить, но драйвер JDBC может игнорировать ваши инструкции. Я не знаю, что делает драйвер Oracle с помощью функции fetchSize(). В большинстве случаев он наблюдал, что драйвер JDBC MySQL всегда будет извлекать все строки, если вы не установите fetchSize() в Integer.MIN_VALUE, но это не относится к Oracle Database.

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