[DOTNETVN] [Phần 1] Kết nối SQL

[ADO.NET A TO Z] Mở đầu cho chuyên đề về thao tác với Microsoft SQL với ADO.NET là vấn đề kết nối. Có một số thứ mình muốn trình bày thêm mặc dù việc kết nối tới SQL không hề khó.

Để thao tác được với SQL bước đầu tiên không thể thiếu đó là tạo một kết nối đến SQL, vậy làm thế nào để tạo một kết nối tới SQL ?. C# cung cấp cho chúng ta sẵn một đối tượng gọi là SqlConnection thuộc thư viện System.Data.SqlClient trong .Net Framework.

Cú pháp sử dụng đơn giản như sau:

SqlConnection sqlConnection = 
                new SqlConnection("your connect string here");
sqlConnection.Open();
 //do somthing
sqlConnection.Close();

Chúng ta sẽ bàn luận một tí về đoạn code trên nhé:

Như các bạn thấy để SqlConnection hoạt động chúng ta cần cung cấp một chuỗi kết nối được quy định theo format của microsoft, quy tắt tạo chuỗi kết nối rất đơn giản nhưng một số bạn lại không nhớ được và thường phải sử dụng google để tìm theo mình thì đó là củ chuối nhé =))).

Ok trước tiên chúng ta cần một số thông tin như sau:

1. Server: localhost

2. DatabaseName: DotnetVn

3. Login Name: dotnetvn

4. Password: 123456789

Tiếp theo chúng ta cần ráp chúng lại thành một chuỗi hoàn chỉnh, các thông tin trên cách nhau bằng dấu chấm phẩy nhé ";"

Data Source = localhost => mục 1

Initial Catalog = DotnetVn => mục 2

User Id = dotnetvn => mục 3

Password = 123456789 => mục 4

Cuối cùng ta ráp tất cả lại thành một chuỗi cách nhau bằng dấu ';'

Data Source = localhost ; Initial Catalog = DotnetVn ; User Id = dotnetvn ; Password = 123456789

Ngoài ra còn một chuỗi kết nối không cần tài khoản là đó sử dụng Account Window, cái này thì khi setup các bạn phải chọn chế độ cho phép login bằng tài khoản window nhé

Data Source = localhost ; Initial Catalog = DotnetVn ; Integrated Security=true

Ngoài ra còn một số setting khác nhưng mình không đề cập ở đây vì chỉ cần chuỗi cơ bản như vầy là các bạn có thể thoải mái làm việc rồi, các bạn có thể tìm hiểu thêm ở đây nhé https://www.connectionstrings.com/sql-server/

Ok xong về phần chuỗi kết nối giờ chúng ta sẽ quay lại đoạn code trên để bàn một số vấn đề nhé

1. Đóng / mở kết nối:

Ở đoạn code trên khi mở kết nối chúng ta dùng hàm Open() và khi đống kết nổi chúng ta dùng hàm Close(). Cách này thì cũng ổn thôi nhưng mình muốn các bạn sử dụng một cách khác mà cũng chính tài liệu trên MSDN của Microsoft đề nghị luôn là mở kết nối sử dụng từ khóa using(...) {...} như sau:

using (SqlConnection sqlConnection =
                new SqlConnection("your connect string here"))
{
    sqlConnection.Open();
    //do something
}

Vậy lợi ích của từ khóa using là gì? Thật ra khi chạy nó sẽ thực thi như sau:

SqlConnection connection = new SqlConnection(connectionString));

try
{
    connection.Open();
}
finally
{
    connection.Dispose();
}

Đơn giản là nó tự động giúp chúng ta quản lý đóng kết nối smiley

2. Có nên giữ kết nối hay không ?

Có một số bạn thắc mắc rằng tại sao cần đóng kết nối nhỉ ? trong khi mình cần phải sử dụng nó ở nhiều hàm khác nhau vậy mở luôn có phải tốt hơn không, không phải tốn công mở lại nữa tốn thời gian kết nối.

Thật ra thì việc giữ kết nối liên tục cũng phát sinh một số vấn đề khi bạn có nhiều truy xuất đến datatabse, ngay cả khi bạn nghĩ là bạn không gọi hàm Close() thì nó sẽ tận dụng kết nối đó cho các lần truy xuất khác nhưng không nhé, thực chất sẽ có rất nhiều kết nối mới tới SQL được mở khi bạn thực thi một function nào đó việc này sẽ ảnh hướng đến tài nguyên cũng như performance số lượng Connection tối đa của SQL là có giới hạn ở 32767 kết nối mà thôi. Và khi nó tới ngưỡng Maximun thì bạn kết chuyện gì xảy ra rồi đó => nó chết chứ sao nữa broken heart

Vậy giải pháp là gì ? chẳng lẽ cứ tạo mới hoài ha. Oh no Microsoft đã tính cả rồi và có một thứ mà mình muốn các bạn nên biết đó là Connection Pool. Mặc định khi bạn mở và đóng kết nối, .Net Framework sẽ cache kết nối có sẵn vào Connection Pool và khi gọi Open() lần nữa thực chất là nó sẽ tận dụng lại connection đã tạo nằm trong Pool nên lần mở tiếp theo sẽ rất là nhanh đó, nếu không tin các bạn có thể thử làm như sau:

//1.
using (SqlConnection sqlConnection =
    new SqlConnection("your connect string here"))
{
    sqlConnection.Open();
    //do something
}

//2.
using (SqlConnection sqlConnection =
    new SqlConnection("your connect string here"))
{
    sqlConnection.Open();
    //do something
}

Tốc độ kết nối ở lần 2 sẽ nhanh hơn lần 1 các bạn có thể sử dụng class StopWatch để đo thời gian nhé.

Mặt định thì Pool Size là 100 tức là lưu trữ lại 100 kết nối nhé, bạn có thể cấu hình để gia tăng số lượng Pool Size lên trong chuỗi kết nối bằng cách thêm option theo ví dụ sau:

Max Pool Size = 500 => mình setting tăng lên 500 nhé, đặt trong chuỗi kết nối cách các option khác bằng dấu ';' nhé.

Vậy túm lại đề nghị của mình là sau khi dùng xong thì nhớ đóng kết nối nhé angel

Thông tin bài viết