Jag har testat olika typer av DAO (jag publicerar inte kod här eftersom den är så smutsig) :
- Med Hibernate :~200 ms
- Med (injicerad) Spring JDBCTemplate och RowMapper :~70 ms
- Med Java Statement :~2 ms
- Med Java OracleStatement :~5 ms
- Med Java PreparedStatement :~100 ms
- Med Java PreparedStatement justerad med Fetch size =5000 :~50 ms
- Med Java OraclePreparedStatement :~100 ms
- Med Java OraclePreparedStatement justerad med PreHetch-storlek =5000 :~170 ms
Anmärkningar:
- DAO injiceras av Spring istället för nya ClientDao() :+30 ms förlorade (-sjuk-)
- Anslutningstid till DB:46ms
Jag skulle kunna använda :
- Java-utlåtande med manuellt sanerade fält.
- Föranslutning vid programstart
- Använd inte Spring Injection
Men :
- Inte riktigt säker / säker
- Snabbt för ett litet antal rader, långsamt att mappa ResultSet till enhet på stort antal rader (jag har också detta användningsfall)
Så :
Spring JDBCTemplate med RowMapper verkar vara den bästa lösningen för att öka prestandan i specifika fall. Och vi kan behålla en säkerhet på SQL-frågor. Men måste skriva specifik RowMapper för att omvandla ResultSet till Entity.
Exempel 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;
}
}
Exempel 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;
}
}
Kanske kan bli bättre, alla förslag är välkomna.