Chúng tôi có dịch vụ web C# WCF được lưu trữ trên Windows 2008 SP2/IIS 7 truy cập cơ sở dữ liệu Oracle. Thường truy cập dữ liệu hoạt động tốt nhưng trong quá trình thử tải, nó thường lần ra ngoài và các bản ghi và ngoại lệ nói:Nhà cung cấp dữ liệu Oracle cho .NET: Yêu cầu kết nối đã hết thời gian
Error occurred when processing XXXXXXXX Web Service
Oracle.DataAccess.Client.OracleException Connection request timed out at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)
at Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, Object src)
at Oracle.DataAccess.Client.OracleConnection.Open()
at MyWorkspace.WorkForceDataAccess.CheckStaffIdInRSW()
at MyWorkspace.MyClass.MyFunction(MyDataType MyData)
Để truy vấn cơ sở dữ liệu, chúng tôi sử dụng một cái gì đó như thế này:
OracleConnection orConn = new OracleConnection();
orConn.ConnectionString = "user id=xxx; password=xxx; Connection Timeout=600; Max Pool Size=150; data source= (DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = MYHOST.MYDOMAIN.com)(PORT = 1771)) (CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = MYSERVICE.MYDOMAIN.com)))";
orConn.Open();
using (var cmd = new OracleCommand("MY_UTIL.check_StaffIdInRSW", orConn) { CommandType = CommandType.StoredProcedure })
{
cmd.Parameters.Add("P_Staff_Id", OracleDbType.Int32);
cmd.Parameters["P_Staff_Id"].Direction = ParameterDirection.Input;
cmd.Parameters["P_Staff_Id"].Value = Convert.ToInt32(MyDataObject.StaffId);
cmd.Parameters.Add("P_retvalue", OracleDbType.Int32);
cmd.Parameters["P_retvalue"].Direction = ParameterDirection.Output;
cmd.ExecuteNonQuery(); // Execute the function
//obtain result
returnVal = int.Parse(cmd.Parameters["P_retvalue"].Value.ToString());
}
Tôi khá tự tin rằng thủ tục được lưu trữ đang được gọi không phải lúc nào cũng được thực hiện. Đó là một thủ tục khá đơn giản để kiểm tra nhanh nếu P_Staff_Id tồn tại trong bảng và trả về kết quả.
Ngoài ra, điều này chỉ xảy ra trong khi kiểm tra tải. Trong quá trình hoạt động bình thường, mọi thứ vẫn ổn nhưng trong quá trình tải nặng với 1 tin nhắn mỗi giây, điều này xảy ra sau khi chạy trơn tru trong một thời gian.
Là một workaround, tôi đã thêm "Connection Timeout = 600; Max Pool Size = 150“ vào chuỗi kết nối, nhưng điều đó không khắc phục được vấn đề này
Chúng tôi đã cùng một ứng dụng đang chạy trên một máy chủ phát triển. và nó hoạt động tốt. Chúng tôi không bao giờ gặp phải vấn đề này ở đó.
Bất kỳ lời đề nghị như những gì để cố gắng sẽ được đánh giá. Dường như tôi đang chạy ra các tùy chọn.
Các stacktrace gợi ý rằng các thủ tục không phải là vấn đề. Ngoại lệ được nâng lên trước khi thực thi trong Connection.Open, vì vậy có vẻ như máy cơ sở dữ liệu bị quá tải nên nó không thể đáp ứng với máy khách trong khoảng thời gian chờ. Nó không nên liên quan đến kích thước hồ bơi hoặc các quy trình hạn chế trong Oracle, các trường hợp ngoại lệ ném khác nhau. Ngoài ra tôi sẽ nghi ngờ về kích thước hồ bơi đó bởi vì nó sẽ không có ý nghĩa để có hồ bơi lớn hơn đáng kể so với số lượng cơ sở dữ liệu lõi có thể sử dụng. Hoặc bạn có rò rỉ kết nối ở đâu đó. – Husqvik
Tôi đã thêm Thời gian chờ kết nối và Kích thước nhóm tối đa cho chuỗi kết nối sau khi vấn đề này xuất hiện - nhưng nó không giúp ích gì. Dịch vụ web đã hoạt động tốt trong môi trường DEV mà không có các dịch vụ này. Bằng cách rò rỉ kết nối, bạn có đề nghị đóng và xử lý đối tượng OracleConnection một cách rõ ràng sau khi nó được sử dụng không? – DjD
Kết nối quảng cáo bị rò rỉ - nếu đối tượng kết nối chỉ ngắn ngủi trong một hàm duy nhất thì sử dụng (var connection = ...) {...} chắc chắn là an toàn hơn. Nhưng tôi không nghĩ đây là vấn đề. Bạn sẽ nhận được ngoại lệ khác nhau khi hồ bơi được sử dụng đầy đủ. Thử nghiệm tải quảng cáo - Tôi hy vọng bạn chạy nhiều phiên bản của ứng dụng hoặc chức năng song song. Cũng hy vọng rằng bạn sử dụng kết nối chuyên dụng, không phải máy chủ được chia sẻ như cài đặt Oracle. Bạn có thể kiểm tra xem các phiên xem xét trong cơ sở dữ liệu trong quá trình thử nghiệm để xem có bao nhiêu phiên và có bao nhiêu phiên hoạt động thực sự có. – Husqvik