Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

HikariCP:Batas waktu level basis data apa yang harus dipertimbangkan untuk mengatur maxLifetime untuk Oracle 11g

Jawaban singkat:tidak ada (secara default).

Sebagai catatan (untuk menyertakan detail di sini jika tautan berubah), kita berbicara tentang properti maxLifetime dari HikariCP:

Properti ini mengontrol masa pakai maksimum koneksi di kolam renang. Koneksi yang sedang digunakan tidak akan pernah dihentikan, hanya ketika ditutup maka koneksi tersebut akan dihapus. Kami sangat menyarankan untuk menyetel nilai ini, dan itu harus kurang dari 30 detik dari batas waktu koneksi yang diberlakukan database atau infrastruktur. Nilai 0 menunjukkan tidak ada masa pakai maksimum (masa pakai tak terbatas), tentu saja tunduk pada pengaturan idleTimeout. Bawaan:1800000 (30 menit)

Dalam pengalaman saya, itu hal yang baik bahwa HikariCP melakukan itu. Sejauh yang saya tahu secara default Oracle tidak memberlakukan masa pakai maksimum untuk koneksi (baik di sisi driver JDBC (1), atau di sisi server (2)). Jadi dalam hal ini, "batas waktu koneksi yang diberlakukan infrastruktur " adalah +infinity -- dan itu menjadi masalah bagi kami, karena kami mengamati masalah dengan koneksi yang berumur panjang. Ini juga berarti nilai apa pun adalah "setidaknya 30 detik lebih sedikit ", termasuk default :)

Saya seandainya lapisan koneksi tidak melakukan apa-apa tentang ini karena mengandalkan lapisan kolam di atas untuk menangani hal-hal seperti itu. Itu tidak mungkin dengan (sekarang tidak digunakan lagi) kumpulan koneksi implisit, dan saya tidak tahu apakah UCP (pengganti) melakukan itu, tetapi jika Anda menggunakan HikariCP, Anda tidak menggunakannya.

Sekarang, setelah 30 menit (biasanya setelah banyak digunakan kembali untuk berbagai tujuan) untuk koneksi tertentu, HikariCP menutupnya dan membuat koneksi baru. Itu memiliki biaya yang sangat kecil, dan memperbaiki masalah kami dengan koneksi berumur panjang. Kami senang dengan default itu, tetapi tetap membuatnya dapat dikonfigurasi untuk berjaga-jaga (lihat 2 di bawah).

(1) OracleDataSource tidak menawarkan titik konfigurasi apa pun (properti atau properti sistem) untuk mengontrolnya, dan saya mengamati seumur hidup tak terbatas.

(2) Untuk batas sisi server, lihat parameter profil IDLE_TIME . Mengutip jawaban ini:

Oracle secara default tidak akan menutup koneksi karena tidak aktif. Anda dapat mengonfigurasi profil dengan IDLE_TIME untuk menyebabkan Oracle menutup koneksi yang tidak aktif.

Untuk memverifikasi berapa nilai IDLE_TIME untuk pengguna Anda, menggabungkan jawaban dari T&J ini:

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

Nilai default adalah UNLIMITED .

Harap dicatat mungkin ada batasan lain yang diberlakukan di tempat lain (firewall... ) yang mungkin mengganggu. Jadi sebaiknya Anda membuatnya dapat dikonfigurasi , jika masalah tersebut ditemukan saat Anda menerapkan produk.

Di Linux, Anda dapat memverifikasi masa pakai maksimum koneksi fisik dengan memantau soket TCP yang terhubung ke database Anda. Saya telah menjalankan skrip di bawah ini di server saya (dari sudut pandang DB itulah klien host), dibutuhkan 1 argumen, ip:port dari simpul Oracle Anda, seperti yang muncul di output netstat -tan (atau sebuah pola jika Anda memiliki beberapa simpul).

#!/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"

Jika Anda menjalankannya dan menghentikannya dengan ctrl-c selama sleep waktu, itu harus keluar dari loop dan membersihkan direktori temp, tetapi ini tidak 100% sangat mudah

Dalam hasil tidak ada port yang menunjukkan nilai yang melebihi 1800 detik (yaitu 30 menit), memberi atau mengambil satu menit. Lihat contoh keluaran di bawah, contoh pertama menunjukkan 2 soket di atas 1800-an, kemudian hilang 10 detik.

------------ 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

Anda harus menjalankan skrip selama lebih dari 30 menit untuk melihatnya, karena skrip tidak mengetahui usia soket yang ada sebelumnya




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Data dari Oracle di utf-8 dengan php

  2. Bagaimana cara mengetahui bahwa Oracle Client yang diinstal adalah 32 bit atau 64 bit?

  3. Deteksi siklus dengan anjak subquery rekursif

  4. GROUP BY tanpa fungsi agregat

  5. Operator Oracle MINUS Dijelaskan