Còn có thuật ngữ hay dùng là Connection Pooling (gộp kết nối lại).
Khi có nghiệp vụ kết nối đến SQL Server, hãy đảm bảo rằng connection pooling (biến kết nối nào đang OPEN thì sử dụng chính nó, đừng tạo thêm kết nối mới)
Điều này giúp tái sử dụng kết nối, giảm thời gian kết nối.
csharp
using (SqlConnection connection = new SqlConnection(connectionString))
{
connection.Open();
// Thực hiện các thao tác với cơ sở dữ liệu 01
// Thực hiện các thao tác với cơ sở dữ liệu 02
// ..
// Thực hiện các thao tác với cơ sở dữ liệu n
}
Ví dụ cách viết code lãng phí tài nguyên:
SqlConnection connection1 = new SqlConnection(connectionString);
connection1.doSQL("sql ....");
SqlConnection connection2 = new SqlConnection(connectionString);
connection2.doSQL("sql ....");
// Đoạn code trên tạo 2 connect, nhưng chỉ để thực hiện 2 đoạn sql gần nhau.
Tránh sử dụng SELECT *. , ngoài trừ cần thiết.
Sử dụng chỉ mục: Tạo chỉ mục cho các cột thường xuyên được truy vấn.
Sử dụng câu lệnh được chuẩn bị (Parameterized Queries): Giúp giảm nguy cơ SQL Injection và tối ưu hóa hiệu suất.
Ví dụ từ table chứng từ có 10 cột, nhưng ta chỉ cần lấy cột So,TenKhachHang,SoTien thì ta chỉ chọn 3 cột, chứ không *.
using (SqlCommand command = new SqlCommand("SELECT So,TenKhachHang,SoTien FROM ChungTuWHERE Nam= @value", connection))
{ command.Parameters.AddWithValue("@value", value); }
Ví dụ: bạn cần lấy table KhachHang và NhomKhachHang
Có 2 cách code
Cách 1:
DataTable dtKH = LibSQL("Select * from KhachHang");
DataTable dtNhom = LibSQL("Select * from NhomKhachHang");
* Cách này 2 lần connect SQL
Cách 2:
DataSet dsAll = LibSQL_dataset("Select * from KhachHang;Select * from NhomKhachHang");
* Cách này 1 lần connect SQL
⇒Bạn tham khảo DataSet trong C# nhé
=> Nếu là bạn thì nên chọn cách nào cách 1/ cách 2 để tối ưu kết nối.
Select TOP , phân trang dữ liệu.
Sử dụng các phương thức bất đồng bộ (async) để không làm tắc nghẽn luồng chính, cải thiện khả năng phản hồi của ứng dụng.
await connection.OpenAsync();
using (SqlCommand command = new SqlCommand("SELECT Column1 FROM Table", connection))
{
using (SqlDataReader reader = await command.ExecuteReaderAsync())
{
// Xử lý dữ liệu
}
}
Đảm bảo sử dụng transaction khi thực hiện nhiều thao tác liên quan để giữ tính toàn vẹn dữ liệu.
using (var transaction = connection.BeginTransaction())
{
using (SqlCommand command = new SqlCommand("UPDATE Table SET Column1 = @value", connection, transaction))
{
command.Parameters.AddWithValue("@value", value);
command.ExecuteNonQuery();
}
transaction.Commit();
}
Đảm bảo cấu hình timeout cho kết nối và các lệnh sao cho hợp lý, tránh gặp phải tình trạng đợi quá lâu.
Vấn đề này bạn cần giỏi về quản trị server / vps
Dừng các services của SQL / liên quan đến SQL không cần thiết.
Ví dụ: nếu như web app và server chung 1 IP / trên cùng server thì bạn nên tắt chức năng Share SQL nhé !
Tìm kiếm: khai thac toi da connection da tao ra;toi uu cau lenh sql;thuc hien truy van bat dong bo;su dung transaction trong sql khi nghiem vu nhieu luong xu ly.;cau hinh timeout hop ly tranh lang phi tai nguyen;toi uu cau hinh server;
Tối ưu kết nối C# với SQL Server