PHP 不支持真正的多線程,傳統非持久連接每次請求都需建立/銷毀數據庫會話,CPU 開銷巨大且擴展性極差;持久連接雖緩解頻繁握手,卻導致每個 Apache 進程/線程長期佔用一條數據庫連接,內存壓力隨並發線性增長。這對高併發 Web 應用構成雙重瓶頸。
Oracle 11g 引入的 DRCP 將連接池下沉至數據庫服務端進程中,實現跨進程、跨中間件節點的連接共享。其核心特性:
官方測試環境(4 CPU Intel Xeon MP 2.80GHz, 2GB RAM, 32bit RHEL 4)顯示:支撐 14,000 並發連接時 CPU 佔用約 65%。但獨立第三方測試表明,實際業務負載下(含 SQL 解析、網絡交互、事務邏輯)性能增益會打折。建議以「連接數擴展性提升 5-10 倍、中間件內存降低 60%+」作為工程預期基線。
// oci8 連接字串指定 POOLED 屬性
$conn = oci_pconnect('scott', 'tiger', '//dbhost:1521/orcl:POOLED');
// 或在 php.ini 全局啟用
oci8.connection_class = "MYAPP_CLASS"
oci8.default_prefetch = 100
搭配 oci8.privileged_connect 與連接類別,可實現多應用隔離共享同一 DRCP 池。
| 場景 | 建議 |
|---|---|
| 高併發、短事務、讀多寫少 Web 應用 | 首選 DRCP,收益最大 |
| 長事務、批量作業、獨佔資源需求 | 避免使用 DRCP,改用專用連接 |
| 多租戶共享數據庫實例 | 按租戶劃分連接類別,配合資源管理計劃限制佔比 |
DRCP 並非銀彈,但它精準解決了「無線程 PHP + 高併發 + 有限數據庫資源」的結構性矛盾。正確配置連接類別、池大小(MINSIZE/MAXSIZE/INCRSIZE)、閒置超時,配合應用端連接獲取/釋放模式優化,可讓 PHP 應用以極低邊際成本支撐數萬級並發連接。