Keepalive บน Oracle Database: SQLNET.EXPIRE_TIME

วันนี้จะเอาเคสที่เจอสดๆ ร้อนๆ เมื่อไม่นานนี้เองมาเล่าให้ฟังครับ เริ่มเรื่องมาจากทาง Developer team ต้องการสร้าง Connection บนดาต้าเบสทิ้งไว้คล้ายๆ การทำงานของ On-demand batch ซึ่งเค้าต้องการให้ Establish session ทิ้งเอาไว้ แต่ผลจากการเทสปรากฏว่า Database session ถูก terminate ออกจากระบบหลังจากที่ Connect เข้ามาทุกๆ 30 นาที ซึ่งหลังจากตรวจสอบแล้วสันนิษฐานกันว่าเป็นเพราะ Firewall setting ที่คอยตัดการเชื่อมต่อของ Idle connection ครับ และหลังจากตรวจสอบ OS parameter ที่เกี่ยวข้อง TCP Keepalive ซึ่งก็คือ net.ipv4.tcp_keepalive_time พบว่าเป็นค่า Default ซึ่งก็คือ 2 ชั่วโมง

แล้วทำยังไงถึงจะแก้ปัญหานี้ได้หละ???

Keepalive หรอ? SQLNET.EXPIRE_TIME คือคำตอบครับ!

บน Oracle database มีพารามิเตอร์อยู่ตัวนึงครับที่ทำงานคล้ายๆ กับ TCP Keepalive ของ OS มีชื่อว่า SQLNET.EXPIRE_TIME ซึ่งพารามิเตอร์ตัวนี้จะมีผลก็ต่อเมื่อเราทำการเซ็ตค่านี้บนฝั่ง Database server เท่านั้นนะครับ พารามิเตอร์ตัวนี้จะเก็บอยู่ใน sqlnet.ora ครับและค่า Default ของมันคือ 0 ส่วนหลักการทำงานของมันเป็นดังนี้ครับ

– Dead connection detection

มันจะทำงานบน application layer และทำงานอยู่ระดับบนสุดของ TCP/IP protocol เช่นกัน ดังนั้นถ้าคุณเปลี่ยนพารามิเตอร์ SQLNET.EXPIRE_TIME = 10 โดยที่ค่า 10 หน่วยของมันคือนาทีครับ นั้นหมายถึงเมื่อ Connections ใดๆ ไม่ได้อยู่บนฐานข้อมูลแล้วหลังจาก 10 นาทีจะถูก Terminate และคืนทรัพยากรระบบกลับคืนมา แต่สำหรับ Connections ที่ยังใช้งานอยู่บนฐานข้อมูล ในกรณีนี้ผมจะพูดถึง INACTIVE sessions ที่ INACTIVE มาแล้ว 10 นาทีก็จะมีการส่ง Retransmission package ไปตรวจสอบ Session นั้นๆ ว่ายังอยู่หรือไม่ ซึ่งการทำงานนั้นเหมือนกับ TCP Keepalive บน OS ทุกประการครับ ต่างกันตรงที่มันอยู่บนฐานข้อมูลเท่านั้นเองครับ

ปล. ต้องขอโทษด้วยนะครับ ที่เคสนี้ไม่มีตัวอย่างให้ชมกัน เพราะว่ายากมากที่จะ Simulate ขึ้นมา = =’

สำหรับข้อมูลเพิ่มเติม สามารถอ่านได้จากที่นี้ครับ
Keepalive for Database Connections?

Advertisements

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s