Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Spring JPA Hibernate:consulta SELECT lenta


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.