Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

HikariCP:Thời gian chờ cấp cơ sở dữ liệu nào nên được xem xét để đặt maxLifetime cho Oracle 11g

Câu trả lời ngắn gọn:không (theo mặc định).

Đối với hồ sơ (để bao gồm chi tiết ở đây trong trường hợp liên kết thay đổi), chúng ta đang nói về thuộc tính maxLifetime của HikariCP:

Thuộc tính này kiểm soát thời gian tồn tại tối đa của một kết nối trong nhóm. Một kết nối đang được sử dụng sẽ không bao giờ bị gỡ bỏ, chỉ khi nó bị đóng thì nó mới bị xóa. Chúng tôi thực sự khuyên bạn nên đặt giá trị này và nó phải ít hơn ít nhất 30 giây so với bất kỳ giới hạn thời gian kết nối nào do cơ sở dữ liệu hoặc cơ sở hạ tầng áp đặt. Giá trị 0 cho biết không có thời gian tồn tại tối đa (thời gian tồn tại vô hạn), tất nhiên là tùy thuộc vào cài đặt thời gian chờ. Mặc định:1800000 (30 phút)

Theo kinh nghiệm của tôi, việc HikariCP làm được điều đó là một điều tốt. Theo như tôi có thể nói theo mặc định, Oracle không thực thi thời gian tồn tại tối đa cho các kết nối (không phải ở phía trình điều khiển JDBC (1), cũng không phải ở phía máy chủ (2)). Vì vậy, về mặt này, " giới hạn thời gian kết nối do cơ sở hạ tầng áp đặt "is + infinity - và đó là một vấn đề đối với chúng tôi, vì chúng tôi đã quan sát thấy các vấn đề với các kết nối lâu dài. Điều đó cũng có nghĩa là bất kỳ giá trị nào cũng" ít hơn ít nhất 30 giây ", bao gồm cả giá trị mặc định :)

Tôi cho rằng lớp kết nối không làm bất cứ điều gì về điều này bởi vì nó dựa vào lớp nhóm ở trên để xử lý những thứ như vậy. Không thể thực hiện được với nhóm kết nối ngầm (hiện không được dùng nữa) và tôi không biết liệu UCP (thay thế) có làm được điều đó hay không, nhưng nếu bạn sử dụng HikariCP thì bạn không sử dụng chúng.

Bây giờ, sau 30 phút (thường là sau nhiều lần sử dụng lại cho các mục đích khác nhau) cho một kết nối nhất định, HikariCP sẽ đóng nó và tạo một kết nối mới. Điều đó có một chi phí rất nhỏ và đã khắc phục sự cố của chúng tôi với các kết nối lâu dài. Chúng tôi hài lòng với mặc định đó, nhưng vẫn làm cho nó có thể định cấu hình chỉ trong trường hợp (xem 2 bên dưới).

(1) OracleDataSource không cung cấp bất kỳ điểm cấu hình nào (thuộc tính hoặc thuộc tính hệ thống) để kiểm soát điều đó và tôi đã quan sát thấy thời gian tồn tại vô hạn.

(2) Đối với giới hạn phía máy chủ, hãy xem thông số cấu hình IDLE_TIME . Trích dẫn câu trả lời này:

Oracle theo mặc định sẽ không đóng kết nối do không hoạt động. Bạn có thể định cấu hình cấu hình với IDLE_TIME để khiến Oracle đóng các kết nối không hoạt động.

Để xác minh giá trị của IDLE_TIME là gì cho người dùng của bạn, kết hợp các câu trả lời từ Hỏi và Đáp này:

select p.limit
from dba_profiles p, dba_users u
where p.resource_name = 'IDLE_TIME' and p.profile = u.profile and u.username = '...'
;

Giá trị mặc định là UNLIMITED .

Xin lưu ý rằng có thể có các giới hạn khác được thực thi ở nơi khác (tường lửa ...) có thể gây trở ngại. Vì vậy, tốt hơn bạn nên làm cho nó có thể định cấu hình , trong trường hợp các vấn đề như vậy được phát hiện khi bạn triển khai sản phẩm của mình.

Trên Linux, bạn có thể xác minh thời gian tồn tại tối đa của các kết nối vật lý bằng cách giám sát các ổ cắm TCP được kết nối với cơ sở dữ liệu của bạn. Tôi đang chạy tập lệnh bên dưới trên máy chủ của mình (theo quan điểm của DB thì đó là máy khách host), cần 1 đối số, ip:port của nút oracle của bạn, như nó xuất hiện trong đầu ra của netstat -tan (hoặc một mẫu nếu bạn có nhiều nút).

#!/bin/bash
target="$1"
dir=$(mktemp -d)
while sleep 10
do
    echo "------------ "$(date)
    now=$(date +%s)
    netstat -tan | grep " $target " | awk '{print $4}' | cut -f2 -d: | while read port
    do
        file="p_$port"
        [ ! -e $file ] && touch $file
        ftime=$(stat -c %Z "$file")
        echo -e "$port :\t "$(( now - ftime))
    done
done
\rm "$dir"/p_*
\rmdir "$dir"

Nếu bạn chạy nó và dừng nó bằng ctrl-c trong khi sleep thời gian, nó sẽ thoát khỏi vòng lặp và dọn dẹp thư mục tạm thời, nhưng điều này không an toàn 100%

Trong kết quả không có cổng nào hiển thị giá trị vượt quá 1800 giây (tức là 30 phút), cho hoặc mất một phút. Xem đầu ra ví dụ bên dưới, mẫu đầu tiên hiển thị 2 ổ cắm trên 1800, chúng sẽ biến mất sau 10 giây.

------------ Thu Jul 6 16:09:00 CEST 2017
49806 :  1197
49701 :  1569
49772 :  1348
49782 :  1317
49897 :  835
49731 :  1448
49620 :  1830
49700 :  1569
49986 :  523
49722 :  1498
49715 :  1509
49711 :  1539
49629 :  1820
49732 :  1448
50026 :  332
49849 :  1036
49858 :  1016
------------ Thu Jul 6 16:09:10 CEST 2017
49806 :  1207
49701 :  1579
49772 :  1358
49782 :  1327
49897 :  845
49731 :  1458
49700 :  1579
49986 :  533
49722 :  1508
49715 :  1519
49711 :  1549
49732 :  1458
50026 :  342
49849 :  1046
49858 :  1026

Bạn sẽ cần chạy tập lệnh trong hơn 30 phút để xem điều đó, vì tập lệnh không biết tuổi của các ổ cắm đã tồn tại trước đó




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để lưu BLOB dưới dạng tệp trong PL / SQL?

  2. cách tìm chỉ mục trên bảng trong oracle

  3. Tên cột bảng Oracle có khoảng trắng

  4. phương ngữ ngủ đông cho oracle 12c

  5. kiểu bộ sưu tập cục bộ không được phép trong câu lệnh SQL