Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Spring JPA Hibernate:langsame SELECT-Abfrage

Ich habe verschiedene Arten von DAO getestet (ich veröffentliche hier keinen Code, weil er so schmutzig ist):

  • Mit Ruhezustand :~200ms
  • Mit (injiziertem) Spring JDBCTemplate und RowMapper :~70 ms
  • Mit Java-Anweisung :~2 ms
  • Mit Java OracleStatement :~5 ms
  • Mit Java PreparedStatement :~100ms
  • Mit Java PreparedStatement angepasst mit Fetch size =5000 :~50ms
  • Mit Java OraclePreparedStatement :~100ms
  • Mit Java OraclePreparedStatement mit PreFetch-Größe angepasst =5000 :~170ms

Anmerkungen:

  • DAO wird von Spring anstelle von new ClientDao() eingefügt :+30ms verloren (-krank-)
  • Verbindungszeit zu DB:46ms

Ich könnte :

verwenden
  • Java-Anweisung mit manuell bereinigten Feldern.
  • Vorverbindung beim Anwendungsstart
  • Verwenden Sie keine Spring Injection

Aber :

  • Nicht wirklich gesichert/sicher
  • Schnell bei einer kleinen Anzahl von Zeilen, langsam bei der Abbildung von ResultSet auf eine Entität bei einer großen Anzahl von Zeilen (ich habe auch diesen Anwendungsfall)

Also :

Die Spring JDBCTemplate mit RowMapper scheint die beste Lösung zu sein, um die Leistung in bestimmten Fällen zu steigern. Und wir können eine Sicherheit für SQL-Abfragen beibehalten. Aber wir müssen einen bestimmten RowMapper schreiben, um ResultSet in Entity umzuwandeln.

Beispiel für 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;
    }
}

Beispiel für Client-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;
    }
}

Vielleicht kann es besser sein, jeder Vorschlag ist willkommen.