Vấn đề cơ bản cuối cùng là các kết nối cơ sở dữ liệu chưa được phát hành. Khi một kết nối được mở, nó sẽ được đưa ra khỏi nhóm kết nối. Nếu kết nối không bao giờ đóng, nhóm sẽ nghĩ rằng nó vẫn đang được sử dụng. Điều này khiến logic quản lý nhóm định kỳ xác thực lại với cơ sở dữ liệu bằng cách sử dụng chuỗi kết nối ban đầu. Khi mật khẩu thay đổi, điều này nhanh chóng dẫn đến việc đăng nhập không thành công và khóa tài khoản.
// Problem logic; connection is never closed/returned to the connection pool.
public static void ConnPoolTest1()
{
OracleConnection conn = new OracleConnection(connectionStringWithPooling);
conn.Open();
//...Do some work
// Sit on this line for 5-10 minutes and examine Oracle's dba_audit_trail.
Console.ReadKey(); // Since connection was never released back to the connection pool, the
// data provider's pool management will regularly re-authenticate with DB.
// If user's password changes before this process dies (releasing the
// connection pools), you start accumulating failed password attempts.
}
Cách khắc phục thích hợp cho sự cố này là đảm bảo các kết nối luôn được đưa trở lại nhóm khi bạn hoàn thành chúng!
// Best practice: ALWAYS CLOSE YOUR CONNECTIONS WHEN YOU ARE DONE!
public static void ConnPoolTest2()
{
OracleConnection conn = new OracleConnection(connectionStringWithPooling);
conn.Open();
//...Do some work
conn.Close();
// Sit on this line for 5-10 minutes and examine Oracle's dba_audit_trail.
Console.ReadKey(); // No problem here! No recurring authentication attempts because the
// connection has been returned to the pool.
}
LƯU Ý:Các câu trả lời khác đề xuất tắt tính năng gộp và xóa các nhóm kết nối cũ khi mật khẩu thay đổi. Những đề xuất này phù hợp với chúng tôi như một bản vá tạm thời trong khi chúng tôi tìm kiếm các tài nguyên chưa được phát hành và chúng đã giúp chúng tôi giải quyết vấn đề một cách đáng kể.