Có nó là an toàn để vượt qua một kết nối. Bạn xử lý kết nối trong một khối điều khiển bên ngoài. Không có gì không an toàn về nó.
Điều không an toàn là viết mã không đảm bảo kết nối được xử lý đúng cách một cách kịp thời. Quên làm sạch một tài nguyên không liên quan đến việc chuyển nó đi khắp nơi. Bạn có thể dễ dàng viết mã để lại kết nối treo mà không cần chuyển nó đi bất cứ đâu.
Trong C ++, bạn được RAII bảo vệ nếu bạn phân bổ trên ngăn xếp hoặc sử dụng các con trỏ thông minh. Trong C # đưa ra một quy tắc cứng rằng tất cả các đối tượng dùng một lần (như kết nối) được khai báo trong khối "sử dụng". Trong Java dọn dẹp với logic thử cuối cùng. Có đánh giá mã trên tất cả các mã lớp dữ liệu để đảm bảo điều này.
Trường hợp sử dụng phổ biến nhất là khi bạn có một số thao tác có thể được kết hợp theo nhiều hoán vị. Và mỗi hoán vị này cần phải là một giao dịch nguyên tử (tất cả thành công hoặc quay trở lại). sau đó bạn phải chuyển giao dịch (và do đó kết nối tương ứng) xung quanh tất cả các phương thức.
Giả sử chúng ta có nhiều hành động foobar () có thể được kết hợp theo nhiều cách khác nhau như các giao dịch nguyên tử.
//example in C#
//outer controlling block handles clean up via scoping with "using" blocks.
using (IDbConnection conn = getConn())
{
conn.Open();
using (IDbTransaction tran = conn.BeginTransaction())
{
try
{//inner foobar actions just do their thing. They don't need to clean up.
foobar1(tran);
foobar2(tran);
foobar3(tran);
tran.Commit();
}
catch (Exception ex)
{ tran.Rollback(); }
}
}//connection is returned to the pool automatically
BTW bạn sẽ muốn mở các kết nối càng sớm càng tốt, loại bỏ chúng càng sớm càng tốt. Đồng đội của bạn có thể đúng nếu bạn coi các kết nối là thành viên đối tượng, giới thiệu họ là trạng thái không cần thiết và để kết nối mở lâu hơn mức cần thiết. Nhưng hành động chuyển một kết nối hoặc giao dịch như một tham số không phải là sai.
BTW. Tùy thuộc vào sự hỗ trợ ngôn ngữ của bạn cho các chức năng hạng nhất, bạn có thể thực hiện một danh sách các hành động foobar (). Vì vậy, một chức năng có thể xử lý tất cả các hoán vị của các hành động. Loại bỏ sự trùng lặp của khối điều khiển bên ngoài cho mỗi hoán vị.