Тествах различни видове DAO (не публикувам код тук, защото е много мръсен):
- С хибернация :~200 ms
- С (инжектиран) Spring JDBCTemplate и RowMapper :~70 ms
- С израз на Java :~2 ms
- С Java OracleStatement :~5 ms
- С Java PreparedStatement :~100ms
- С Java PreparedStatement, коригиран с Fetch size =5000 :~50ms
- С Java OraclePreparedStatement :~100ms
- С Java OraclePreparedStatement, коригиран с размер PreFetch =5000 :~170 ms
Бележки:
- DAO, инжектиран от Spring вместо new ClientDao() :+30ms загубени (-sick-)
- Време за връзка с DB:46ms
Мога да използвам :
- Изявление на Java с ръчно почистени полета.
- Предварително свързване при стартиране на приложението
- Не използвайте Spring Injection
Но :
- Не е наистина защитен/сигурен
- Бързо за малък брой редове, бавно за картографиране на ResultSet към обект на голям брой редове (имам и този случай на употреба)
И така:
Пролетният JDBCTшаблон с RowMapper изглежда е най-доброто решение за увеличаване на производителността при конкретен случай. И можем да запазим сигурността на SQL заявките. Но трябва да напишем конкретен RowMapper, за да трансформираме ResultSet в Entity.
Пример за 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;
}
}
Пример за 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;
}
}
Може би може да е по-добре, всяко предложение е добре дошло.