Apakah ada batas waktu untuk permintaan melalui tautan basis data?

11

Edit / Pendahuluan: Pertanyaan ini telah dimigrasikan dari SO karena saya sangat tertarik dengan pertanyaan tentang timeout pada permintaan tautan DB. Solusi yang disediakan dari SO agak OK, tapi saya benar-benar tertarik dengan pertanyaan itu sendiri.

Motivasi:
Saya memiliki satu kueri yang menjalankan "selamanya" (lebih dari 2 hari, sampai saya mengakhiri sesi), yang menggunakan tautan basis data. Masalahnya tampaknya bahwa basis data jauh menjadi tidak tersedia dan untuk beberapa alasan belum diketahui tidak ORA-02068ada dinaikkan (tidak akan dibahas di sini) dan permintaan hanya menunggu dan menunggu.

(Permintaan dikeluarkan oleh pekerjaan dbms_scheduler, yang menjalankan prosedur dalam paket PL / SQL. Akibatnya, pekerjaan itu juga macet. Tapi itu bukan minat khusus untuk inti dari pertanyaan ini)

Saya telah mensimulasikan situasi ini dengan meletakkan salah satu DB pengujian saya dalam mode diam dan menanyakannya melalui tautan basis data. Seperti yang telah diantisipasi, permintaan menunggu sampai dibatalkan secara manual atau DB jarak jauh tidak diumumkan.

Pertanyaan:
Saya tidak memiliki kontrol atas perilaku dan up-time basis data jauh, jadi saya sedang mencari beberapa kemungkinan untuk menetapkan batas waktu pada permintaan yang menggunakan tautan basis data.

Saya sudah melihat profil ( CPU_PER_CALLdll), sqlnet.oraparameter, menambahkan parameter penamaan lokal langsung ke string koneksi (seperti menambahkan (connect_timeout=10)ke definisi tautan basis data), menjalankan perintah dengan ... for update wait 1, tetapi mereka bekerja untuk sesi sibuk atau idle, tetapi tidak untuk sesi menunggu.

Jadi saya sedang mencari beberapa opsi di sisi "lokal" dari tautan basis data, yang mana yang menetapkan batas waktu untuk permintaan atas tautan basis data.
Beberapa solusi suka alter session set xyzatau select ... from a@b "wait 100" --(yes, I know this syntax doesn't exist)akan dihargai, karena saya tidak punya hak DBA pada DB tertentu ini.

Saya saat ini menggunakan 10gR2 tetapi meningkatkan ke 11gR2 dalam beberapa minggu, jadi ide untuk versi ini akan berguna.

GWu
sumber
bagaimana kueri digunakan? bagian dari prosedur / paket yang lebih besar, yang mendasari SQL untuk tampilan mat, dijalankan dari aplikasi eksternal, ...? Saya tidak tahu tentang sintaks "tunggu xxx" sederhana, solusi Anda mungkin perlu menjadi bagian dari program yang lebih besar, tergantung pada penggunaan Anda.
Permintaan dikeluarkan oleh pekerjaan dbms_scheduler, yang mengeksekusi prosedur dalam paket PL / SQL. (pertanyaan diperbarui dengan itu)
GWu

Jawaban:

4

Karena Anda menggunakan dbms_scheduler, Anda dapat mengatur atribut max_run_duration pekerjaan ke batas tertentu, dan kemudian memiliki penjadwal mengirim email kepada Anda jika acara itu dinaikkan. Di belakang layar, Oracle menggunakan tabel antrian (yang dapat memungkinkan Anda untuk menciptakan pekerjaan yang memanas ketika suatu acara dimunculkan , jika Anda ingin mengambil langkah-langkah tambahan untuk melakukan lebih banyak otomatisasi di sekitar respons Anda). Tetapi pada dasarnya pekerjaan apa pun yang berjalan di atas max_run_duration yang Anda setup akan meningkatkan jenis acara: JOB_OVER_MAX_DUR

Sepotong email dibuat dalam 11gr2, lihat di sini untuk penulisan yang baik.

Semoga itu bisa membantu.


sumber
ide bagus, terima kasih! Ini bukan jawaban untuk pertanyaan spesifik tentang batas waktu pada tautan DB, tapi saya kira itu menyelesaikan masalah awal saya, jadi +1 :-). Saya tidak tahu tentang max_run_duration dan mulai dari ini saya baru menemukan cara untuk menghentikan & menjatuhkan pekerjaan yang digantung ( forums.oracle.com/forums/thread.jspa?threadID=521939#2002982 )
GWu
Untuk beberapa alasan saya tidak max_run_durationdapat mengangkat acara tersebut, jadi saya mengajukan pertanyaan baru di sini
GWu
0

Saya tidak mengatakan saya punya solusi tetapi saya juga ingin diskusi lebih lanjut tentang cara mengontrol batas waktu dblink. Saya kira bisa dibayangkan untuk menulis kode yang menyalakan suatu peristiwa, atau menunggu peristiwa batas waktu TNS, dan kemudian menjalankan:

ALTER SESSION CLOSE DATABASE LINK dblink;

Anda tentu saja dapat polling server jauh sebelumnya dengan:

select * from dual@dblink

untuk memeriksa apakah itu tersedia, tetapi itu tidak memperbaiki masalah kode yang berjalan terlalu lama pada remote. Kode jarak jauh yang buruk harus mengaktifkan acara tunggu, jadi saya kira itu bisa terjebak (bahkan di tingkat kelas dalam 12c). Itu masih tidak memberi kita solusi elegan untuk memaksa sesi dblink ke timeout.

sandman
sumber