sql >> Database >  >> RDS >> Oracle

Spring JPA Hibernate:langzame SELECT-query

Ik heb verschillende soorten DAO getest (ik publiceer hier geen code omdat het zo vies is):

  • Met slaapstand :~200ms
  • Met (geïnjecteerde) Spring JDBCTemplate en RowMapper :~70 ms
  • Met Java-verklaring :~2 ms
  • Met Java OracleStatement :~5 ms
  • Met Java PreparedStatement :~100ms
  • Met Java PreparedStatement aangepast met Fetch size =5000 :~50ms
  • Met Java OraclePreparedStatement :~100ms
  • Met Java OraclePreparedStatement aangepast met PreFetch-grootte =5000:~170ms

Opmerkingen:

  • DAO geïnjecteerd door Spring in plaats van nieuwe ClientDao() :+30ms verloren (-sick-)
  • Verbindingstijd naar DB:46ms

Ik zou kunnen gebruiken:

  • Java-verklaring met handmatig opgeschoonde velden.
  • Pre-verbinding bij het starten van de applicatie
  • Gebruik geen veerinjectie

Maar :

  • Niet echt beveiligd/veilig
  • Snel voor een klein aantal rijen, traag om ResultSet toe te wijzen aan entiteit op een groot aantal rijen (ik heb ook deze use-case)

Dus:

De Lente JDBCTemplate met RowMapper lijkt de beste oplossing te zijn om de prestaties in een specifiek geval te verbeteren. En we kunnen een beveiliging houden voor SQL-query's. Maar we moeten specifieke RowMapper schrijven om ResultSet naar Entity te transformeren.

Voorbeeld van 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;
    }
}

Voorbeeld van 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;
    }
}

Misschien kan het beter, elke suggestie is welkom.




  1. MySql verleent machtigingen voor alle databases die beginnen met <string>

  2. Eenvoudigste manier voor PHP e-mailverificatielink

  3. Groeperen op waarden die op volgorde staan

  4. Is er een manier om meerdere triggers in één script te maken?