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.