Eu testei diferentes tipos de DAO (não publico código aqui porque é muito sujo):
- Com hibernação :~200ms
- Com Spring JDBCTemplate (injetado) e RowMapper :~70 ms
- Com declaração Java :~2 ms
- Com Java OracleStatement :~5 ms
- Com Java PreparedStatement :~100ms
- Com Java PreparedStatement ajustado com Fetch size =5000 :~50ms
- Com Java OraclePreparedStatement :~100ms
- Com Java OraclePreparedStatement ajustado com tamanho PreFetch =5000 :~170ms
Observações:
- DAO injetado pelo Spring em vez de novo ClientDao() :+30ms perdidos (-sick-)
- Tempo de conexão ao banco de dados:46ms
Eu poderia usar :
- Instrução Java com campos limpos manualmente.
- Pré-conexão na inicialização do aplicativo
- Não use injeção de mola
Mas :
- Não é realmente seguro/seguro
- Rápido para um pequeno número de linhas, lento para mapear ResultSet para entidade em um grande número de linhas (também tenho este caso de uso)
Então:
O Spring JDBCTtemplate com RowMapper parece ser a melhor solução para aumentar o desempenho em casos específicos. E podemos manter uma segurança nas consultas SQL. Mas precisamos escrever RowMapper específico para transformar ResultSet em Entity.
Exemplo de Spring JDBCTtemplate
@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;
}
}
Exemplo de cliente 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;
}
}
Talvez possa ser melhor, qualquer sugestão é bem-vinda.