Inilah situasi umum:
- Anda perlu menerapkan operasi massal dalam aplikasi yang menggunakan kerangka kerja ORM.
- Setelah lulus pertama, Anda telah melihat masalah kinerja yang signifikan.
Inilah pertanyaan saya:
- Dalam situasi ini, haruskah Anda mendukung solusi yang mencakup SQL mentah?
- Atau ada pola desain terkenal yang dapat membantu Anda mengurangi masalah yang umumnya terkait dengan operasi massal dengan kerangka kerja ORM?
EDIT:
- Saya tidak bertanya apakah Anda harus menghapus kerangka kerja ORM dari seluruh aplikasi.
- Saya bertanya: Haruskah Anda melupakan kerangka kerja ORM untuk aplikasi kecil ini?
orm
heuristics
Jim G.
sumber
sumber
Jawaban:
ORM tidak dimaksudkan untuk sepenuhnya mengambil alih akses ke basis data Anda. Gunakan untuk 80% kode yang CRUD, hal-hal yang terlalu membosankan untuk ditulis sendiri. Gunakan prosedur tersimpan, SQL dinamis, atau apa pun yang Anda inginkan untuk sisa 20% yang perlu dioptimalkan dengan cermat.
sumber
Saya menggunakan ORM (nHibernate) dalam aplikasi yang membutuhkan kinerja tinggi dan menangani miliaran catatan. Seiring waktu kami memperhatikan bahwa sebagian besar masalah kinerja yang signifikan terkait dengan cara kami sendiri menggunakan ORM daripada karena ORM saja.
ORM seharusnya tidak menggantikan pengetahuan database wajib Anda. Ini adalah alat yang Anda gunakan untuk mendapatkan lebih banyak produktivitas dan fleksibilitas dalam kode Anda, tetapi Anda harus mengetahui proses yang mendasarinya untuk mengoptimalkan kinerja Anda.
Anda tidak menentukan ORM tertentu, jadi inilah hal-hal yang kami lakukan untuk meningkatkan kinerja:
sumber
Kami berhasil melakukannya dengan Entity Framework, tetapi aplikasi kami melakukan banyak operasi gaya batch (kami akan menulis sejumlah besar catatan ke tabel individu), jadi itu sangat cocok. Saya pasti akan melihat apakah mungkin untuk mempertahankan kerangka ORM jika memungkinkan, hanya untuk mengurangi jumlah kode tujuan khusus di aplikasi Anda. Apakah mungkin untuk menulis buffer, kemudian menjalankannya sebagai grup? Anda kehilangan semantik transaksi, tetapi jika Anda pergi dengan operasi massal saya menganggap Anda sudah setuju dengan itu.
sumber
ORM tidak melakukan sesuatu yang ajaib. Mereka menerjemahkan metode akses objek ke dalam SQL. Pernyataan SQL yang mereka jalankan tidak selalu lebih lambat dari SQL yang Anda tulis secara manual. Karena itu, ada beberapa masalah yang mungkin Anda temui:
Tidak ada yang salah dengan menggunakan SQL asli untuk meningkatkan kinerja. Tapi pertama-tama pastikan Anda mengerti apa yang memperlambat Anda.
sumber
Lewati ORM. Tidak hanya itu tetapi memotong sql "biasa" juga. Gunakan utilitas massal database Anda untuk menyisipkan set data yang sangat besar ke tabel pementasan. Kemudian gunakan sql untuk melakukan aktivitas pementasan Anda.
ORM "rasa-of-the-blog" Anda mungkin tidak berfungsi untuk semua situasi.
sumber
Berada dalam situasi itu. Terkadang Anda harus melakukannya.
Beberapa ORM memungkinkan pengembang untuk melewatkan model objek, dan langsung ke lapisan database.
Ada juga ORM, yang menggunakan operasi massal, dienkapsulasi, sebagai Object Oriented.
sumber
Seperti disebutkan oleh umlcat , ada beberapa ORM yang memungkinkan Anda menggunakan operasi massal.
Bahkan lebih baik, banyak ORM dapat dikembangkan, jadi Anda bisa menulis metode Anda sendiri untuk menjalankan operasi massal, jika belum didukung. Jika operasi massal dalam aplikasi Anda adalah sesuatu yang Anda dapat faktor keluar, saya akan menambahkannya sebagai lapisan pada ORM (untuk melakukan itu, Anda mungkin perlu menulis SQL mentah), tetapi kemudian dalam aplikasi, gunakan ORM metode yang telah Anda terapkan.
Ini juga membuat pengujian dan debugging unit lebih mudah. Setelah Anda memiliki cakupan pengujian yang baik untuk metode ORM Anda, Anda bebas untuk menggunakannya di aplikasi Anda. Kalau tidak, debugging SQL mentah (terutama yang besar dengan transaksi dan banyak GABUNG) bisa menyebalkan.
Sekali waktu saya butuh hampir satu hari untuk menemukan bug di panggilan SQL mentah yang hampir 100 LOC, dan bug itu hanya satu karakter! Sejak itu, saya mencoba menghindari SQL mentah di dalam aplikasi, dan memiliki semua prosedur SQL yang diuji unit secara terpisah.
sumber
Yah tidak ada pola desain yang saya sadari. Dugaan saya adalah bahwa Anda membuat keputusan untuk ORM karena suatu alasan, jadi meninggalkan ORM kemungkinan bukan yang Anda inginkan. Namun, dalam kasus ini saya pikir ada ruang untuk menggabungkan kedua solusi. Tidak ada yang salah dengan itu, selama Anda melakukannya dengan hati-hati dan mendokumentasikan mengapa Anda menyimpang dari penggunaan standar ORM dalam perangkat lunak Anda. Selain itu, beberapa kerangka kerja ORM memiliki beberapa fasilitas untuk melakukan operasi massal. Saya tahu nHibernate (ORM untuk .NET framework) telah memanggil StatelessSessions, yang memiliki overhead yang jauh lebih sedikit, tetapi ini mungkin masih tidak memberi Anda peningkatan kinerja yang Anda cari. Dalam hal ini, cukup gunakan SQL mentah.
sumber