sql >> Base de Datos >  >> RDS >> Oracle

Spring JPA Hibernate:consulta SELECT lenta

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.