Testoval jsem různé typy DAO (nepublikuji zde kód, protože je tak špinavý):
- S režimem spánku :~200 ms
- S (Injected) Spring JDBCTemplate a RowMapper :~70 ms
- S příkazem Java :~2 ms
- S Java OracleStatement :~5 ms
- S Java PreparedStatement :~100 ms
- S Java PreparedStatement upraveným s velikostí Fetch =5000 :~50 ms
- S Java OraclePreparedStatement :~100 ms
- S Java OraclePreparedStatement upravenou pomocí velikosti PreFetch =5000:~170 ms
Poznámky:
- DAO vložil Spring namísto nové ClientDao() :+30 ms ztraceno (-sick-)
- Doba připojení k DB:46 ms
Mohl bych použít :
- Příkaz Java s ručně dezinfikovanými poli.
- Předběžné připojení při spuštění aplikace
- Nepoužívejte Spring Injection
Ale :
- Není skutečně zabezpečeno / bezpečné
- Rychlé pro malý počet řádků, pomalé mapování ResultSet na entitu na velkém počtu řádků (také mám tento případ použití)
Takže:
Spring JDBCTemplate pomocí RowMapper se zdá být nejlepším řešením pro zvýšení výkonu v konkrétním případě. A můžeme zachovat zabezpečení pro dotazy SQL. Ale k transformaci ResultSet na Entity je potřeba napsat konkrétní RowMapper.
Příklad jarní 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;
}
}
Příklad klienta 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;
}
}
Možná to může být lepší, každý návrh je vítán.