Oracle
 sql >> Database >  >> RDS >> Oracle

Spring JPA Hibernate:query SELECT lenta

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.