Saya menerapkan logika bisnis saya dalam kelas statis sederhana dengan metode statis. Masing-masing metode ini membuka / menutup koneksi SQL saat dipanggil:
public static void DoSomething(string something)
{
using (SqlConnection connection = new SqlConnection("..."))
{
connection.Open();
// ...
connection.Close();
}
}
Tapi saya pikir menghindari membuka dan menutup koneksi menghemat kinerja . Saya membuat beberapa tes lama sekali dengan kelas OleDbConnection (tidak yakin tentang SqlConnection), dan itu pasti membantu untuk bekerja seperti ini (sejauh yang saya ingat):
//pass the connection object into the method
public static void DoSomething(string something, SqlConnection connection)
{
bool openConn = (connection.State == ConnectionState.Open);
if (!openConn)
{
connection.Open();
}
// ....
if (openConn)
{
connection.Close();
}
}
Jadi pertanyaannya adalah - haruskah saya memilih metode (a) atau metode (b)? Saya membaca pertanyaan stackoverflow lain bahwa penyatuan koneksi menghemat kinerja bagi saya, saya tidak perlu repot sama sekali ...
PS. Ini adalah aplikasi ASP.NET - koneksi hanya ada selama permintaan web. Bukan win-app atau layanan.
c#
sqlconnection
Alex
sumber
sumber
DbConnection.StateChange
acara untuk memantau perubahan dalam perubahan status koneksi (dan mungkin disimpan secara lokal) daripada memeriksaDbConnection.State
properti secara langsung. Ini akan menghemat biaya kinerja Anda.Jawaban:
Tetap berpegang pada opsi a .
Penyatuan koneksi adalah teman Anda.
sumber
Gunakan Metode (a), setiap saat. Ketika Anda mulai menskalakan aplikasi Anda, logika yang berhubungan dengan negara akan menjadi sangat menyakitkan jika Anda tidak melakukannya.
Penyatuan koneksi melakukan apa yang tertulis di kaleng. Coba pikirkan apa yang terjadi saat skala aplikasi, dan seberapa sulit mengelola status buka / tutup koneksi secara manual. Kumpulan koneksi melakukan pekerjaan yang baik untuk menangani ini secara otomatis. Jika Anda khawatir tentang kinerja, pikirkan tentang semacam mekanisme cache memori sehingga tidak ada yang diblokir.
sumber
Selalu tutup koneksi segera setelah Anda selesai menggunakannya, sehingga koneksi database yang mendasarinya dapat kembali ke kumpulan dan tersedia untuk pemanggil lain. Penyatuan koneksi dioptimalkan dengan cukup baik, jadi tidak ada penalti yang nyata untuk melakukannya. Nasihatnya pada dasarnya sama dengan untuk transaksi - buat agar tetap pendek dan tutup saat Anda selesai.
Ini menjadi lebih rumit jika Anda mengalami masalah MSDTC dengan menggunakan satu transaksi di sekitar kode yang menggunakan banyak koneksi, dalam hal ini Anda benar-benar harus berbagi objek koneksi dan hanya menutupnya setelah transaksi selesai.
Bagaimanapun Anda melakukan hal-hal dengan tangan di sini, jadi Anda mungkin ingin menyelidiki alat yang mengelola koneksi untuk Anda, seperti Kumpulan Data, Linq ke SQL, Kerangka Kerja Entitas atau NHibernate.
sumber
Penafian: Saya tahu ini sudah tua, tetapi saya menemukan cara mudah untuk menunjukkan fakta ini, jadi saya memasukkan nilai dua sen saya.
Jika Anda kesulitan mempercayai bahwa penggabungan benar-benar akan menjadi lebih cepat, cobalah ini:
Tambahkan yang berikut ini di suatu tempat:
Sekarang ganti semua panggilan ke
Open()
denganTimedOpen()
dan jalankan program Anda. Sekarang, untuk setiap string koneksi berbeda yang Anda miliki, jendela konsol (keluaran) akan memiliki satu jendela yang berjalan lama, dan banyak yang terbuka sangat cepat.Jika Anda ingin memberi label, Anda dapat menambahkan
new StackTrace(true).GetFrame(1) +
ke panggilan keWriteLine
.sumber
Ada perbedaan antara koneksi fisik dan logis. DbConnection adalah sejenis koneksi logis dan menggunakan koneksi fisik yang mendasari ke Oracle. Menutup / membuka DbConnection tidak memengaruhi kinerja Anda, tetapi membuat kode Anda bersih dan stabil - kebocoran koneksi tidak mungkin terjadi dalam kasus ini.
Anda juga harus ingat tentang kasus-kasus ketika ada batasan untuk koneksi paralel pada server db - dengan mempertimbangkan hal itu perlu membuat koneksi Anda sangat pendek.
Kumpulan koneksi membebaskan Anda dari pemeriksaan status koneksi - cukup buka, gunakan, dan segera tutup.
sumber
mis. ketika pengguna melakukan tindakan pengisian, aplikasi Anda perlu menemukan saldo pengguna terlebih dahulu dan memperbaruinya, mereka harus menggunakan koneksi yang sama.
Meskipun ado.net memiliki kumpulan koneksi, biaya pengiriman koneksi sangat rendah, tetapi penggunaan kembali koneksi adalah pilihan yang lebih baik.
Karena koneksi diblokir saat Anda menjalankan beberapa kueri atau perintah, itu berarti aplikasi Anda hanya melakukan satu operasi db pada waktu yang sama, betapa buruk kinerjanya.
Satu lagi masalah adalah bahwa aplikasi Anda akan selalu memiliki koneksi meskipun pengguna Anda hanya membukanya tetapi tidak ada operasi.Jika ada banyak pengguna yang membuka aplikasi Anda, server db akan membebani semua sumber koneksinya dalam waktu dekat sementara pengguna Anda tidak melakukannya apa pun.
sumber