さまざまなタイプのDAOをテストしました(コードが非常に汚れているため、ここでは公開しません):
- Hibernateを使用 :〜200ms
- (挿入された)SpringJDBCTemplateとRowMapperを使用 :〜70ミリ秒
- Javaステートメントを使用 :〜2ミリ秒
- JavaOracleStatementを使用 :〜5ミリ秒
- JavaPreparedStatementを使用 :〜100ms
- フェッチサイズ=5000で調整されたJavaPreparedStatementを使用 :〜50ms
- JavaOraclePreparedStatementを使用 :〜100ms
- PreFetchサイズで調整されたJavaOraclePreparedStatementを使用 =5000:〜170ms
注:
- new ClientDao()の代わりにSpringによって注入されたDAO :+ 30msの損失(-sick-)
- DBへの接続時間:46ミリ秒
私は使用できます:
- 手動でサニタイズされたフィールドを使用したJavaステートメント。
- アプリケーション起動時の事前接続
- スプリングインジェクションを使用しないでください
しかし:
- あまり安全ではない/安全ではない
- 少数の行では高速、多数の行のエンティティにResultSetをマップするのは低速(このユースケースもあります)
だから:
春のJDBCテンプレート RowMapperを使用 特定のケースでパフォーマンスを向上させるための最良のソリューションのようです。SQLクエリのセキュリティを維持できます。ただし、ResultSetをエンティティに変換するには特定のRowMapperを作成する必要があります。
SpringJDBCTemplateの例
@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;
}
}
クライアント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;
}
}
たぶんもっと良いかもしれません、どんな提案も歓迎します。