Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Spring JPA Hibernate :kueri SELECT lambat

Saya telah menguji berbagai jenis DAO (Saya tidak mempublikasikan kode di sini karena sangat kotor) :

  • Dengan Hibernasi :~200 md
  • Dengan (Disuntikkan) Spring JDBCTemplate dan RowMapper :~70 md
  • Dengan Pernyataan Java :~2 md
  • Dengan Java OracleStatement :~5 md
  • Dengan Pernyataan Siap Java :~100 md
  • Dengan Java PreparedStatement disesuaikan dengan ukuran Fetch =5000 :~50 md
  • Dengan Java OraclePreparedStatement :~100 md
  • Dengan Java OraclePreparedStatement disesuaikan dengan ukuran PreFetch =5000 :~170 md

Catatan :

  • DAO disuntikkan oleh Spring alih-alih New ClientDao() :+30 md hilang (-sakit-)
  • Waktu koneksi ke DB :46ms

Saya bisa menggunakan :

  • Pernyataan Java dengan bidang yang dibersihkan secara manual.
  • Pra-koneksi pada peluncuran aplikasi
  • Jangan gunakan Injeksi Pegas

Tapi :

  • Tidak terlalu aman/aman
  • Cepat untuk sejumlah kecil baris, lambat untuk memetakan ResultSet ke entitas pada sejumlah besar baris (Saya juga memiliki kasus penggunaan ini)

Jadi :

Templat JDBC Musim Semi dengan RowMapper tampaknya menjadi solusi terbaik untuk meningkatkan kinerja pada kasus tertentu. Dan kita dapat menjaga keamanan pada kueri SQL. Tetapi perlu menulis RowMapper tertentu untuk mengubah ResultSet menjadi Entity.

Contoh 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;
    }
}

Contoh 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;
    }
}

Mungkin bisa lebih baik, saran apa pun diterima.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengapa dan kapan JAXBElement diperlukan di JAXB?

  2. Inner Join Two Table, menggabungkan bidang varchar

  3. Kesalahan pemicu ORA-04092 ORA-04088

  4. ORA-04021:batas waktu terjadi saat menunggu untuk mengunci objek

  5. Mengulangi variabel bind yang sama beberapa kali saat menggunakan OPEN...UNTUK struktur SQL dinamis di Oracle PL/SQL