Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Spring JPA Hibernate:truy vấn SELECT chậm

Tôi đã thử nghiệm các loại DAO khác nhau (Tôi không xuất bản mã ở đây vì nó quá bẩn):

  • Với Hibernate :~ 200ms
  • Với Spring JDBCTemplate và RowMapper :~ 70 mili giây
  • Với Câu lệnh Java :~ 2 mili giây
  • Với Java OracleStatement :~ 5 mili giây
  • Với Java PreparedStatement :~ 100ms
  • Với Java PreparedStatement được điều chỉnh với kích thước Tìm nạp =5000 :~ 50ms
  • Với Java OraclePreparedStatement :~ 100ms
  • Với Java OraclePreparedStatement được điều chỉnh với kích thước Tìm nạp trước =5000:~ 170 mili giây

Ghi chú:

  • DAO được đưa vào bởi Spring thay vì ClientDao () mới :+ 30ms bị mất (-sick-)
  • Thời gian kết nối với DB:46ms

Tôi có thể sử dụng:

  • Câu lệnh Java với các trường được làm sạch thủ công.
  • Kết nối trước khi khởi chạy ứng dụng
  • Không sử dụng Spring Injection

Nhưng:

  • Không thực sự bảo mật / an toàn
  • Nhanh đối với một số lượng nhỏ hàng, chậm ánh xạ ResultSet thành thực thể trên một số lượng lớn hàng (tôi cũng có trường hợp sử dụng này)

Vì vậy:

Spring JDBCTemplate với RowMapper dường như là giải pháp tốt nhất để tăng hiệu suất trong từng trường hợp cụ thể và chúng ta có thể giữ an toàn cho các truy vấn SQL nhưng cần phải viết RowMapper cụ thể để chuyển đổi ResultSet thành Entity.

Ví dụ về 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;
    }
}

Ví dụ về 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;
    }
}

Có lẽ có thể tốt hơn, mọi đề xuất đều được hoan nghênh.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tuyên bố ORACLE IIF

  2. CẬP NHẬT câu lệnh trong Oracle bằng cách sử dụng SQL hoặc PL / SQL để CHỈ cập nhật hàng trùng lặp đầu tiên

  3. Tìm kiếm Oracle danh sách các từ trong chuỗi và chạy lại các từ hiện có

  4. chọn (ngày) khác biệt trả lại cùng một ngày vài lần

  5. Oracle INSERT thành hai bảng trong một truy vấn