He probado diferentes tipos de DAO (no publico código aquí porque es muy sucio):
- Con Hibernate :~200ms
- Con (inyectado) Spring JDBCTemplate y RowMapper :~70ms
- Con instrucción Java :~2ms
- Con Java OracleStatement :~5ms
- Con Java PreparedStatement :~100ms
- Con Java PreparedStatement ajustado con Fetch size =5000 :~50ms
- Con Java OraclePreparedStatement :~100ms
- Con Java OraclePreparedStatement ajustado con tamaño PreFetch =5000 :~170ms
Notas:
- DAO inyectado por Spring en lugar de nuevo ClientDao() :+30ms perdidos (-enfermo-)
- Tiempo de conexión a la base de datos:46 ms
Podría usar:
- Declaración de Java con campos desinfectados manualmente.
- Preconexión al iniciar la aplicación
- No use inyección de resorte
Pero:
- No realmente seguro/seguro
- Rápido para una pequeña cantidad de filas, lento para asignar ResultSet a una entidad en una gran cantidad de filas (también tengo este caso de uso)
Entonces:
La plantilla Spring JDBC con RowMapper parece ser la mejor solución para aumentar el rendimiento en casos específicos. Y podemos mantener la seguridad en las consultas SQL. Pero necesitamos escribir RowMapper específico para transformar ResultSet en Entity.
Ejemplo de 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;
}
}
Ejemplo 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;
}
}
Tal vez pueda ser mejor, cualquier sugerencia es bienvenida.