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

Spring JPA Hibernate:langsom SELECT-forespørgsel

Jeg har testet forskellige typer DAO (jeg udgiver ikke kode her, fordi den er så beskidt) :

  • Med Hibernate :~200 ms
  • Med (injiceret) Spring JDBCTemplate og RowMapper :~70 ms
  • Med Java-erklæring :~2 ms
  • Med Java OracleStatement :~5 ms
  • Med Java PreparedStatement :~100 ms
  • Med Java PreparedStatement justeret med Fetch-størrelse =5000 :~50 ms
  • Med Java OraclePreparedStatement :~100 ms
  • Med Java OraclePreparedStatement justeret med PreFetch-størrelse =5000 :~170 ms

Bemærkninger:

  • DAO injiceret af Spring i stedet for ny ClientDao() :+30 ms tabt (-syg-)
  • Forbindelsestid til DB:46ms

Jeg kunne bruge :

  • Java-erklæring med manuelle desinficerede felter.
  • Forudgående forbindelse ved applikationsstart
  • Brug ikke Spring Injection

Men :

  • Ikke rigtig sikret/sikkert
  • Hurtig for et lille antal rækker, langsom til at tilknytte ResultSet til entitet på et stort antal rækker (jeg har også denne use case)

Så :

Forår JDBCT-skabelonen med RowMapper synes at være den bedste løsning til at øge ydeevnen på specifikke sager.Og vi kan bevare en sikkerhed på SQL-forespørgsler.Men er nødt til at skrive specifik RowMapper for at transformere ResultSet til Entity.

Eksempel på 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;
    }
}

Eksempel på 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;
    }
}

Måske kan være bedre, ethvert forslag er velkomne.




  1. Kopiér kolonneværdi fra én tabel til en anden matchende id - SQLite

  2. Iteration gennem PostgreSQL-poster. Hvordan henvises til data fra næste række?

  3. Brug for hjælp til optimering af MySQL-forespørgsel med få joinforbindelser

  4. MySQL hvordan man ændrer innodb-log-filstørrelse