Прежде чем описывать мою проблему, я хочу сообщить вам, что я новичок весной.Как реализовать lazy db data fetching using spring
Так вот я просто кладу пример кода, что я делаю для выборки данных из БД с помощью JdbcTemplate:
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriver(new org.apache.derby.jdbc.EmbeddedDriver());
dataSource.setUrl("jdbc:derby:C:/Users/mypc/Downloads/db-derby-10.12.1.1-bin/db-derby-10.12.1.1-bin/demo/databases/toursdb;create=true");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<Map<String, Object>> rows = jdbcTemplate.queryForList("select * from " + tableName);
dataSource.getConnection().close();
System.out.println(rows);
Так вот я вложил в ResultSet карту, а затем вернуть его. Проблема заключается в том, что он выбрасывает исключение памяти кучи java для большого массива данных (как я уже упоминал выше, для примера используется код).
Теперь я изменяю эту реализацию с помощью RowCallbackHandler().
Так что мой модифицированный код теперь
SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriver(new org.apache.derby.jdbc.EmbeddedDriver());
dataSource.setUrl("jdbc:derby:C:/Users/mypc/Downloads/db-derby-10.12.1.1-bin/db-derby-10.12.1.1-bin/demo/databases/toursdb;create=true");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.setFetchSize(200);
jdbcTemplate.query("select * from " + tableName, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
Map<String, Object> rowInMap = new HashMap<String, Object>();
for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++) {
rowInMap.put(rs.getMetaData().getColumnName(i), rs.getObject(i));
}
System.out.println(rowInMap);
}
});
dataSource.getConnection().close();
Но проблема заключается в том, как использовать rowcallbackhandler метод из другого метода из другого класса, который будет потреблять данные lazyly и, очевидно, она должна быть поточно. Он будет использоваться для теста JUnit.
'потребляйте данные лениво'. Я не думаю, что это означает, что вы думаете, что это значит. То, что вам кажется нужным, является пакетной, то есть потребительский код извлекает данные партиями определенного фиксированного размера (например, 20, 50, 100 независимо) и обрабатывает их в кусках. – Taylor
да, я точно хочу заполнить мою карту с 20 данными, а затем обработать ее снова bck до результата, чтобы получить часть, и она заполнит карту следующими 20 данными. – saba
Я еще раз говорю, что вы занимаетесь дозированием с помощью шаблонов jdbc. – Taylor