Ich habe verschiedene Arten von DAO getestet (ich veröffentliche hier keinen Code, weil er so schmutzig ist):
- Mit Ruhezustand :~200ms
- Mit (injiziertem) Spring JDBCTemplate und RowMapper :~70 ms
- Mit Java-Anweisung :~2 ms
- Mit Java OracleStatement :~5 ms
- Mit Java PreparedStatement :~100ms
- Mit Java PreparedStatement angepasst mit Fetch size =5000 :~50ms
- Mit Java OraclePreparedStatement :~100ms
- Mit Java OraclePreparedStatement mit PreFetch-Größe angepasst =5000 :~170ms
Anmerkungen:
- DAO wird von Spring anstelle von new ClientDao() eingefügt :+30ms verloren (-krank-)
- Verbindungszeit zu DB:46ms
Ich könnte :
verwenden- Java-Anweisung mit manuell bereinigten Feldern.
- Vorverbindung beim Anwendungsstart
- Verwenden Sie keine Spring Injection
Aber :
- Nicht wirklich gesichert/sicher
- Schnell bei einer kleinen Anzahl von Zeilen, langsam bei der Abbildung von ResultSet auf eine Entität bei einer großen Anzahl von Zeilen (ich habe auch diesen Anwendungsfall)
Also :
Die Spring JDBCTemplate mit RowMapper scheint die beste Lösung zu sein, um die Leistung in bestimmten Fällen zu steigern. Und wir können eine Sicherheit für SQL-Abfragen beibehalten. Aber wir müssen einen bestimmten RowMapper schreiben, um ResultSet in Entity umzuwandeln.
Beispiel für Spring JDBCTemplate
@Repository
public class ClientJdbcTemplateDao {
private final Logger logger = LoggerFactory.getLogger(ClientJdbcTemplateDao.class);
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public List<Client> find() {
List<Client> c = this.jdbcTemplate.query( "SELECT login FROM Client WHERE LOGIN='xxxx' AND PASSWORD='xxx'", new ClientRowMapper());
return c;
}
}
Beispiel für Client-RowMapper
public class ClientRowMapper implements RowMapper<Client> {
@Override
public Client mapRow(ResultSet arg0, int arg1) throws SQLException {
// HERE IMPLEMENTS THE CONVERTER
// Sample :
// String login = arg0.getString("LOGIN")
// Client client = new Client(login);
// return client;
}
}
Vielleicht kann es besser sein, jeder Vorschlag ist willkommen.