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.