Ho testato diversi tipi di DAO (non pubblico codice qui perché è così sporco) :
- Con ibernazione :~200 ms
- Con (iniettato) Spring JDBCTemplate e RowMapper :~70 ms
- Con Java Statement :~2 ms
- Con Java OracleStatement :~5 ms
- Con Java PreparedStatement :~100 ms
- Con Java PreparedStatement regolato con dimensione di recupero =5000 :~50 ms
- Con Java OraclePreparedStatement :~100 ms
- Con Java OraclePreparedStatement adattato alle dimensioni di PreFetch =5000 :~170 ms
Note :
- DAO iniettato da Spring invece di new ClientDao() :+30ms persi (-malato-)
- Tempo di connessione al DB:46 ms
Potrei usare :
- Java Statement con campi sanificati manualmente.
- Pre-connessione all'avvio dell'applicazione
- Non utilizzare Spring Injection
Ma :
- Non proprio protetto/sicuro
- Veloce per un numero ridotto di righe, lento nell'associare ResultSet all'entità su un numero elevato di righe (anche io ho questo caso d'uso)
Quindi:
Il Template JDBC di primavera con RowMapper sembra essere la soluzione migliore per aumentare le prestazioni su casi specifici. E possiamo mantenere una sicurezza sulle query SQL. Ma è necessario scrivere RowMapper specifico per trasformare ResultSet in Entity.
Esempio di 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;
}
}
Esempio di RowMapper client
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;
}
}
Forse può essere migliore, ogni suggerimento è il benvenuto.