<-
Apache > HTTP 伺服器 > 文件 > 2.4 版 > 模組

Apache 模組 mod_dbd

可用語言:  en  |  fr 

說明管理 SQL 資料庫連線
狀態擴充套件
模組識別碼dbd_module
原始檔mod_dbd.c
相容性2.1 版之後

摘要

mod_dbd 使用 APR 管理 SQL 資料庫連線。它可以在需要 SQL 資料庫功能的模組提出要求時提供資料庫連線,而且會妥善管理資料庫,以達到執行緒與非執行緒 MPM 的最佳效率與擴充能力。如需詳情,請參閱 APR 網站和原始開發人員撰寫的 Apache DBD 架構 概述。

Support Apache!

主題

指令

問題修正清單

請參閱

top

連線池

此模組以平台優化方式管理資料庫連線。在非執行緒平台上,它提供了連線,如同傳統的 LAMP (Linux、Apache、Mysql、Perl/PHP/Python)。在執行緒平台上,它提供可擴充又有效率的連線池,就如 ApacheTutor 的這篇文章 中所描述。請注意,mod_dbd 優先於該篇文章中呈現的模組。

top

連線

若要連線到資料庫,你需要指定驅動程式和連線參數。每個資料庫引擎的資料各不相同。例如,若要連線到 MySQL,請執行下列動作

DBDriver mysql
DBDParams host=localhost,dbname=pony,user=shetland,pass=appaloosa

然後,你可以使用其他各種模組中的這個連線,包括 mod_rewritemod_authn_dbdmod_lua。每個模組的文件中都會有更詳細的使用範例。

請參閱 DBDParams,以取得每一個受支援的資料庫驅動程式的連線字串資訊。

top

Apache DBD API

mod_dbd 匯出五個函數供其他模組使用。API 如下

typedef struct {
    apr_dbd_t *handle;
    apr_dbd_driver_t *driver;
    apr_hash_t *prepared;
} ap_dbd_t;

/* Export functions to access the database */

/* acquire a connection that MUST be explicitly closed.
 * Returns NULL on error
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_open(apr_pool_t*, server_rec*);

/* release a connection acquired with ap_dbd_open */
AP_DECLARE(void) ap_dbd_close(server_rec*, ap_dbd_t*);

/* acquire a connection that will have the lifetime of a request
 * and MUST NOT be explicitly closed.  Return NULL on error.
 * This is the preferred function for most applications.
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_acquire(request_rec*);

/* acquire a connection that will have the lifetime of a connection
 * and MUST NOT be explicitly closed.  Return NULL on error.
 */
AP_DECLARE(ap_dbd_t*) ap_dbd_cacquire(conn_rec*);

/* Prepare a statement for use by a client module */
AP_DECLARE(void) ap_dbd_prepare(server_rec*, const char*, const char*);

/* Also export them as optional functions for modules that prefer it */
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_open, (apr_pool_t*, server_rec*));
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_close, (server_rec*, ap_dbd_t*));
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_acquire, (request_rec*));
APR_DECLARE_OPTIONAL_FN(ap_dbd_t*, ap_dbd_cacquire, (conn_rec*));
APR_DECLARE_OPTIONAL_FN(void, ap_dbd_prepare, (server_rec*, const char*, const char*));
top

SQL 準備好的陳述式

mod_dbd 支援 SQL 準備好的陳述式,讓需要使用這些陳述式的模組能使用。每個準備好的陳述式都必須指定一個名稱 (標籤),並儲存在 hash 中:一個 ap_dbd_tprepared 欄位。Hash 項目為 apr_dbd_prepared_t 類型,並可在任何 apr_dbd 準備好的陳述式 SQL 查詢或選取指令中使用。

由 dbd 使用者模組使用準備好的陳述式,並記錄可以在 httpd.conf 中指定的陳述式,或提供自己的指令並使用 ap_dbd_prepare

注意事項

如果要搭配 MySQL 資料庫使用準備好的陳述式,建議在連線字串中將 reconnect 設定為 0,才能避免 MySQL 客戶端重新連線時未正確重設準備好的陳述式所造成的錯誤。如果設定為 1,系統會嘗試修復所有斷線的連線,但由於 mod_dbd 未收到通知,準備好的陳述式將會失效。
top

安全性警告

任何網路/資料庫應用程式都需要確保自己不會受到 SQL 注入攻擊。在大多數的情況下,Apache DBD 是安全的,因為應用程式會使用準備好的陳述式,而不可信賴的輸入只會做為資料使用。當然,如果你透過第三方模組使用,你應該要確認模組會採取哪些預防措施。

然而,FreeTDS 驅動程式本身並不安全。底層程式庫不支援準備好的陳述式,因此驅動程式會模擬這些陳述式,而不可信賴的輸入會併入 SQL 陳述式中。

透過移除污染所有輸入,就能讓它變得安全:這個程序的靈感來自 Perl 的污染檢查。根據 Perl 的慣例,每個輸入都會與正規表示法進行比對,而只使用比對結果

  $untrusted =~ /([a-z]+)/;
  $trusted = $1;

若要使用這項功能,必須納入已設定好的準備好的陳述式中移除污染的正規表示法。正規表示法在準備好的陳述式中的 % 之後立即出現,並用大括號 {} 括住。例如,如果你的應用程式預期字母數字輸入,你可以使用

"SELECT foo FROM bar WHERE input = %s"

搭配其他驅動程式,最糟的情況只會是查詢失敗。但是配上 FreeTDS,你會需要

"SELECT foo FROM bar WHERE input = %{([A-Za-z0-9]+)}s"

現在與 regexp 的 $1 相符的任何項目都將會被捨棄,所以這個陳述是安全的。

另一個選擇為第三方 ODBC 驅動程式,它提供真正的準備好陳述的安全性。

top

DBDExptime 指令

說明閒置連接的保持運作時間
語法DBDExptime 秒數
預設DBDExptime 300
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

在 DBDKeep 中指定的連接數目已超過時(僅限多執行緒平台),設定空閒連接保持運作的時間。

top

DBDInitSQL 指令

說明在連線到資料庫後執行 SQL 陳述
語法DBDInitSQL "SQL 陳述"
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

模組如果需要,可以在連線到資料庫時執行一個或多個 SQL 陳述。例如,初始化特定值或在與資料庫建立新連線時新增記錄項目。

top

DBDKeep 指令

說明維持的最大連線數
語法DBDKeep 數字
預設DBDKeep 2
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

設定每行程維持的最大連接數,以處理尖峰需求(僅限多執行緒平台)。

top

DBDMax 指令

說明最大連線數
語法DBDMax 數字
預設DBDMax 10
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

設定每行程的硬性最大連接數(僅限多執行緒平台)。

top

DBDMin 指令

說明最小連線數
語法DBDMin 數字
預設DBDMin 1
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

設定每行程的最小連接數(僅限多執行緒平台)。

top

DBDParams 指令

說明資料庫連線參數
語法DBDParams param1=value1[,param2=value2]
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

視底層驅動程式的需求而定。通常用於傳遞任何無法在使用者名稱、密碼、資料庫名稱、主機名稱和連接埠號之間預設使用的東西。

目前驅動程式的連接字串參數包括:

FreeTDS(針對 MSSQL 和 SyBase)
username, password, appname, dbname, host, charset, lang, server
MySQL
host, port, user, pass, dbname, sock, flags, fldsz, group, reconnect
Oracle
user, pass, dbname, server
PostgreSQL
連接字串直接傳遞到 PQconnectdb
SQLite2
連接字串以冒號分割,且 part1:part2 用作 sqlite_open(part1, atoi(part2), NULL)
SQLite3
連接字串直接傳遞到 sqlite3_open
ODBC
資料來源、使用者、密碼、連線、連線逾時、執行動作逾時、存取、交易模式、緩衝區
top

DBDPersist 指令

說明是否使用持續連線
語法DBDPersist 開啟|關閉
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

如果設為關閉,持續連線和匯集的連線會停用。當客戶端要求時,會開啟新的資料庫連線,並在釋放時立即關閉。此選項適用於除錯和低用量的伺服器。

預設是啟用持續連線匯集 (或在非執行緒伺服器的案例中單一 LAMP 型式的持續連線),且幾乎永遠會在作業中使用。

在版本 2.2.2 之前,此指令只接受值 01,而不是 關閉開啟

top

DBDPrepareSQL 指令

說明定義 SQL 準備好的陳述
語法DBDPrepareSQL "SQL 陳述" 標籤
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

對於重複使用單一 SQL 陳述的模組,例如驗證,最佳的效能是在啟動時準備好陳述,而不是每次使用時才準備。這個指令會準備好一個 SQL 陳述,並為其指定標籤。

top

DBDriver 指令

說明指定 SQL 驅動程式
語法DBDriver 名稱
內容伺服器組態、虛擬主機
狀態擴充套件
模組mod_dbd

依據名稱選取 apr_dbd 驅動程式。必須在您的系統上安裝驅動程式 (對大多數系統來說,會是共用物件或 dll)。舉例來說,DBDriver mysql 會在 apr_dbd_mysql.so 中選擇 MySQL 驅動程式。

可用語言:  en  |  fr 

top

留言

注意事項
這裡不是問與答專區。放置在此的留言應指向對於改善文件或伺服器的建議,且如果已實作或被認為無效/離題,管理員可能移除。關於如何管理 Apache HTTP 伺服器的問題應導向 IRC 頻道 #httpd (在 Libera.chat) 或傳送至我們的 郵遞清單