2009-09-23 17 views
7

Trong một ứng dụng web Java mà tôi đang làm việc, chúng tôi đang sử dụng OracleConnectionPoolDataSource cho chức năng kết nối cơ sở dữ liệu. Mỗi cuộc gọi getConnection bao gồm ID và mật khẩu Oracle của người dùng. Vì vậy, mỗi người dùng trong một ý nghĩa kết thúc với hồ bơi kết nối cơ sở dữ liệu của riêng họ.Cài đặt và cập nhật thuộc tính kết nối nhóm (OracleConnectionPoolDataSource) để có hiệu suất tốt nhất

Hiện tại, chúng tôi đang sử dụng các giá trị mặc định cho hầu hết các thuộc tính. Điều này bao gồm

  • MinLimit thiết lập để 0
  • MaxLimit thiết lập để Integer.MAX_VALUE
  • MaxStatementsLimit thiết lập để 0
  • InactivityTimeout thiết lập để 0
  • TimeToLiveTimeout thiết lập để 0
  • AbandonedConnectionTimeout thiết lập để 0
  • PropertyCheckInterval thiết lập để 900
  • ConnectionWaitTimeout thiết lập để 0

Thông tin thêm về các đặc tính này có thể được tìm thấy tại Connection Cache Properties.

Hiện tại chúng tôi không có bất kỳ vấn đề kết nối cơ sở dữ liệu nào rõ ràng, nhưng nghĩ rằng hiệu suất có thể tốt hơn. Câu hỏi của tôi là ai đó có lời khuyên tốt hay một nguồn lực tốt về những gì chúng ta nên xem xét khi điều chỉnh các giá trị này.

Trả lời

6

Hướng dẫn hiệu suất máy chủ ứng dụng Oracle cho bản phát hành 10g 3 (10.1.3.1) cung cấp thông tin chính xác trên how to optimize the connection pool parameters.

Thông tin này hữu ích cho hầu hết các kịch bản liên quan đến ứng dụng sử dụng hồ bơi kết nối để quản lý kết nối với cơ sở dữ liệu Oracle, không chịu được máy chủ ứng dụng đang sử dụng. Ví dụ:

Ví dụ: cách tốt nhất là đặt giá trị cho kích thước hồ bơi tối thiểu. Theo như kích thước hồ bơi tối đa có liên quan, giá trị không nên quá cao vì có thể tải người nghe đặc biệt nếu ứng dụng có xu hướng không đóng kết nối dẫn đến rò rỉ.

Nên đặt giá trị hợp lý cho bộ đệm bảng sao kê, vì điều này cho phép các câu lệnh chuẩn bị được lưu vào bộ nhớ cache, cho phép cải thiện hiệu suất.

Thời gian chờ cũng nên được chọn với môi trường. Ví dụ, thời gian chờ kết nối không được bằng không trong hầu hết các trường hợp, vì điều này có thể gây ra SQLExceptions khi kết nối vật lý không thể được khởi tạo trong hồ bơi trong một khoảng thời gian đủ. Thời gian chờ không hoạt động phải đủ lớn để các kết nối sẽ được xử lý chỉ sau một khoảng thời gian không hoạt động đủ; giá trị quá thấp sẽ dẫn đến kết nối vật lý được tạo và giảm quá thường xuyên.

EDIT: Hướng dẫn được đưa ra trong Hướng dẫn hiệu suất áp dụng cho lớp oracle.jdbc.pool.OracleDataSource, đó là những gì mà Máy chủ ứng dụng Oracle 10g sử dụng cho các nguồn dữ liệu được quản lý vào cơ sở dữ liệu Oracle. Hầu hết nó chắc chắn sẽ chuyển sang OracleConnectionPoolDataSource.

+0

Không hoạt độngThời gian chờ: Khi không hoạt độngThời gian hết hạn, kết nối vật lý cơ bản sẽ bị đóng. Tuy nhiên, kích thước của bộ nhớ cache không được phép thu nhỏ dưới minLimit, nếu đã được thiết lập. - Đây là tài liệu của Oracle và nói rằng minLimit sẽ không thu nhỏ ngay cả khi tất cả các đối tượng kết nối được đóng theo thời gian chờ. Điều này có nghĩa là nó cho phép vật thể cũ sống trong hồ bơi? http://docs.oracle.com/cd/B14117_01/java.101/b10979/conncache.htm#CDEBCBJC –

2

Lời khuyên đầu tiên của tôi: Hồ sơ.

Lời khuyên thứ hai của tôi: Hồ sơ.

Điều gì làm chậm ứng dụng của bạn xuống, cuộc gọi phương thức nào đang khiến hiệu suất ứng dụng của bạn bị ảnh hưởng?

Bạn có liên tục chờ đợi tạo kết nối mới không? Sau đó, đặt MinLimit của bạn thành cao hơn 0, tương tự với 'giới hạn ban đầu' để bạn có một số ít khả dụng để bắt đầu. Nếu bạn muốn MaxLimit của bạn là vô cùng, đặt nó là '0', một thiết lập của 0 cho thấy không có giới hạn.

Bạn có đang tạo kết nối mới khi thực sự bạn nên sử dụng kết nối hiện tại nhưng không hoạt động? Đặt InactivityTimeout của bạn để một cái gì đó bên cạnh 0. Cùng đi cho AbandonedConnectionTimeout.

Lưu ý, điều đầu tiên tôi sẽ tinker với sẽ là 'ban đầu-limit'-

Từ Oracle về ban đầu hạn

này thiết lập kích thước của bộ nhớ cache kết nối khi bộ nhớ cache ban đầu là được tạo hoặc được khởi tạo lại. Khi thuộc tính này được đặt thành giá trị lớn hơn so với 0, nhiều kết nối là được tạo trước và sẵn sàng để sử dụng. Thuộc tính này thường được sử dụng để giảm thời gian "tăng tốc" trong mồi bộ nhớ cache ở kích thước tối ưu.

5

Bạn đã cân nhắc sử dụng Oracle UCP mới chưa? Trích dẫn từ (tôi nhấn mạnh) 11g feature list:

1.4.1.29 kết nối phổ Pool (UCP) cho JDBC

kết nối phổ Pool cho JDBC thay Implicit cache kết nối và cung cấp các chức năng sau:

  • Ghi nhãn kết nối, thu thập kết nối, ghi nhật ký và thống kê
  • Hiệu suất và cải tiến ổn định
  • Cải thiện chẩn đoán và thống kê hoặc số liệu

UCP cho JDBC cung cấp chức năng kết nối nâng cao, hiệu suất được cải thiện và khả năng chẩn đoán kết nối tốt hơn.

+2

Tôi thích câu trả lời này. Rất tiếc, chúng tôi không thể nâng cấp lên trình điều khiển mới tại thời điểm này. – Prof

+1

Bạn nên xem xét nó. IIRC chức năng tổng hợp của Oracle DataSource đã không còn được sử dụng để sử dụng UCP. – yawn

Các vấn đề liên quan