Hier ist der Code. Nehmen wir an, es gibt viele große Bilder in der db, so dass ich nur einen im Speicher behalten möchte. Wie schreibt man das mit JDK 8 Features wie Lambda und Streams?Wie JDBCTemplate Abfrage mit JDK8 Features neu schreiben?
Ich fing an, diese zu verwenden, aber es scheiterte (von https://spring.io/guides/gs/relational-data-access/ und www.jooq.org/java-8-and-sql) und die Verwendung von ResultSetExtractor funktioniert als intendent, aber gibt es eine Möglichkeit, es ohne ResultSetExtractor zu tun?
jdbcTemplate.query(
"select id,image,mimetype from images",
new ResultSetExtractor(){
@Override
public List extractData(ResultSet rs) throws SQLException, DataAccessException {
while(rs.next()){
createThumbnail(new ImageHolder(rs.getInt("id"), rs.getBytes("image"), rs.getString("mimetype")));
}
return null;
}
}
);
Das ist gut aussehende stream/Lambda-Version, die funktioniert, aber hält zu viele Dinge im Speicher und gibt OOME früher oder später.
jdbcTemplate.query(
"select id,image,mimetype from images",
(rs,rowNum)->new ImageHolder(rs.getInt("id"), rs.getBytes("image"),rs.getString("mimetype"))
).stream().forEach(
imageHolder -> createThumbnail(imageHolder)
));
Dies lädt einfach alle Zeilen, bevor es beginnt, um sie „Streaming“.
Ja, gute Lösung, um dieses verpasst. Ich werde testen, ob es tatsächlich funktioniert;) Irgendwie habe ich geglaubt, dass die Abfrage Stream (fähige) Sache zurückgibt, aber obvisouly ist es nicht. – ljack
ops, 'Verursacht von: org.postgresql.util.PSQLException: Nicht genügend Arbeitsspeicher beim Abrufen von Abfrageergebnissen. ' – ljack