描述: | 管理SQL数据库连接 |
---|---|
状态: | 延期 |
模块标识符: | dbd_module |
源文件: | mod_dbd.c |
兼容性: | 2.1版及更高版本 |
mod_dbd
使用APR管理SQL数据库连接
。它根据请求提供与需要SQL数据库功能的模块的数据库连接,并以最佳效率和可伸缩性管理线程和非线程MPM的数据库。有关详细信息,请参见
APR网站和
原始开发人员对Apache DBD Framework的概述
。
该模块以针对平台优化的方式管理数据库连接。在非线程平台上,它以经典LAMP(Linux,Apache,Mysql,Perl / PHP / Python)的方式提供持久连接。在线程平台上,它提供了一个更加可扩展和高效的连接池,如本文在ApacheTutor上所述。请注意,它将mod_dbd
取代该文章中介绍的模块。
要连接到数据库,您需要指定驱动程序和连接参数。这些因一个数据库引擎而异。例如,要连接到mysql,请执行以下操作:
DBDriver mysql DBDParams host=localhost,dbname=pony,user=shetland,pass=appaloosa
然后,您可以使用各种其他模块,包括这方面mod_rewrite
,
mod_authn_dbd
和mod_lua
。这些模块的每个文档中都提供了更多的用法示例。
有关DBDParams
每个受支持的数据库驱动程序的连接字符串信息,请参见。
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*));
mod_dbd
支持可能希望使用它们的模块代表的SQL预准备语句。必须为每个准备好的语句分配一个名称(标签),并将它们存储在哈希中:的prepared
字段ap_dbd_t
。哈希条目是类型apr_dbd_prepared_t
,可以在任何apr_dbd准备语句SQL查询或选择命令中使用。
由dbd用户模块决定是否使用准备好的语句并记录可以在httpd.conf中指定的语句,或者提供自己的指令并使用ap_dbd_prepare
。
reconnect
在连接字符串中将其设置
为0,以避免在未正确重置预备语句的情况下MySQL客户端重新连接而引起的错误。如果设置为1,将尝试修复所有断开的连接,但是由于未通知mod_dbd,因此准备好的语句将无效。
任何Web /数据库应用程序都需要保护自己免受SQL注入攻击。在大多数情况下,Apache DBD是安全的,因为应用程序使用预准备的语句,而不受信任的输入仅用作数据。当然,如果通过第三方模块使用它,则应确定它们可能需要采取哪些预防措施。
但是,FreeTDS驱动程序本质上是 不安全的。基础库不支持准备好的语句,因此驱动程序会对其进行仿真,并将不受信任的输入合并到SQL语句中。
可以通过取消所有输入的限制来确保它的安全:这是受Perl的污染检查启发的过程。根据Perl习惯用法,每个输入都与一个正则表达式匹配,并且仅使用匹配项:
$untrusted =~ /([a-z]+)/;
$trusted = $1;
要使用此功能,必须在配置的准备好的语句中包含无限制的正则表达式。regexp紧跟在prepared语句中%之后,并用大括号{}括起来。例如,如果您的应用程序需要字母数字输入,则可以使用:
"SELECT foo FROM bar WHERE input = %s"
与其他驱动程序一起使用,并且不会比查询失败更糟糕。但是使用FreeTDS,您需要:
"SELECT foo FROM bar WHERE input = %{([A-Za-z0-9]+)}s"
现在,所有与regexp的$ 1不匹配的内容都将被丢弃,因此该语句很安全。
一种替代方法是第三方ODBC驱动程序,它提供了真正的预备语句的安全性。
描述: | 空闲连接的存活时间 |
---|---|
句法: | DBDExptime time-in-seconds |
默认: | DBDExptime 300 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_dbd |
设置超过DBDKeep中指定的连接数(仅线程平台)时保持空闲连接活动的时间。
描述: | 连接到数据库后执行SQL语句 |
---|---|
句法: | DBDInitSQL "SQL statement" |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_dbd |
创建与数据库的连接时,需要的模块可以执行一个或多个SQL语句。用法的示例可能是初始化某些值或在与数据库建立新连接时添加日志条目。
描述: | 最大持续连接数 |
---|---|
句法: | DBDKeep number |
默认: | DBDKeep 2 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_dbd |
设置每个进程要维持的最大连接数,而不是用于处理高峰需求(仅线程平台)。
描述: | 最大连接数 |
---|---|
句法: | DBDMax number |
默认: | DBDMax 10 |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_dbd |
设置每个进程的最大硬连接数(仅线程平台)。
描述: | 数据库连接参数 |
---|---|
句法: | DBDParams
param1=value1[,param2=value2] |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_dbd |
根据底层驱动程序的要求。通常,这将用于传递用户名,密码,数据库名称,主机名和连接端口号中无法默认设置的任何内容。
当前驱动程序的连接字符串参数包括:
PQconnectdb
part1:part2
用作sqlite_open(part1, atoi(part2), NULL)
sqlite3_open
描述: | 是否使用持久连接 |
---|---|
句法: | DBDPersist On|Off |
内容: | 服务器配置,虚拟主机 |
状态: | 延期 |
模块: | mod_dbd |
如果设置为“关”,则禁用持久连接和池连接。客户端请求时将打开一个新的数据库连接,并在发布时立即将其关闭。此选项用于调试和低使用率的服务器。
默认设置是启用持久性连接池(如果是非线程服务器,则启用单个LAMP风格的持久性连接),并且几乎应始终在操作中使用。
在版本2.2.2之前,此伪指令仅接受值0
和,1
而不分别接受
Off
和
On
。