問題を説明する前に、私が春に新しくなったことをお知らせします。バネを使用した遅延dbデータフェッチの実装方法
だからここに私はちょうど私がJDBCTemplateを使用してDBからデータを取得するために何をすべきか、私のサンプルコードを置く:
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);
だからここに私は地図に私の全体の結果セットを配置し、それを返します。問題は、大きなデータセットの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();
あるしかし、問題はlazylyデータを消費し、明らかにそれは、スレッドセーフである必要があり、別のクラスから別のメソッドからrowcallbackhandlerメソッドを使用する方法です。 JUnitテストに使用されます。
「消費データが遅れています」これはあなたが意味すると思うことを意味するとは思わない。あなたが望むと思われるものはバッチ処理です。つまり、消費コードは一定のサイズ(たとえば20,50,100など)のバッチでデータを取得し、チャンクで処理します。 – Taylor
はい正確に私は20のデータでマップを塗りつぶして、再度処理して結果セットを取得し、次の20のデータでマップを埋めます – saba
jdbcテンプレートでバッチ処理を調べます – Taylor