Oracle
 sql >> база данни >  >> RDS >> Oracle

Spring JPA Hibernate:бавна SELECT заявка

Тествах различни видове 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;
    }
}

Може би може да е по-добре, всяко предложение е добре дошло.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да извлечете подмножество от база данни в dbunit файл с помощта на sql заявка?

  2. как да актуализирате идентификатора от една таблица в друга

  3. Може ли някой да обясни какво наистина прави изявлението MERGE в Oracle?

  4. Актуализация на SQL с обединения

  5. Как да повдигна повторно pl/sql изключение в блок за обработка на изключения?