• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • mod_dbd

    描述:管理 SQL 数据库连接
    状态:延期
    模块标识符:dbd_module
    源文件:mod_dbd.c
    兼容性:Version 2.1 以及之后

    摘要

    mod_dbd使用APR管理 SQL 数据库连接。它根据请求向需要 SQL 数据库功能的模块提供数据库连接,并负责管理具有线程和 non-threaded MPM 的最佳效率和可伸缩性的数据库。有关详细信息,请参阅APR网站以及原始开发人员对Apache DBD Framework的概述。

    连接池

    此模块以针对平台优化的方式管理数据库连接。在 non-threaded 平台上,它以经典 LAMP(Linux,Apache,Mysql,Perl/PHP/Python)的方式提供持久连接。在线程平台上,它提供了一个更加可扩展和高效的连接池,如本文在 ApacheTutor 上发表中所述。请注意,mod_dbd取代该文章中提供的模块。

    Connecting

    要连接到数据库,您需要指定驱动程序和连接参数。这些因数据库引擎而异。对于 example,要连接到 mysql,请执行以下操作:

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

    然后,您可以在各种其他模块中使用此连接,包括mod_rewrite,mod_authn_dbd和mod_lua。其他用法示例出现在每个模块的文档中。

    有关每个受支持的数据库驱动程序的连接 string 信息,请参阅DBDParams

    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*));
    

    SQL 准备语句

    mod_dbd代表可能希望使用它们的模块支持 SQL 准备的 statements。必须为每个预准备语句分配一个 name(标签),并将它们存储在散列中:ap_dbd_tprepared字段。散列条目的类型为apr_dbd_prepared_t,可以在任何 apr_dbd 预处理语句 SQL 查询或 select 命令中使用。

    dbd 用户模块可以使用准备好的 statements 并记录 httpd.conf 中可以指定的 statements,或提供自己的指令并使用ap_dbd_prepare

    警告

    将已准备好的 statements 与 MySQL 数据库一起使用时,最好在连接 string 中将reconnect设置为 0,以避免在没有正确重置准备好的 statements 的情况下重新连接 MySQL client 时出现的错误。如果设置为 1,则将尝试修复任何已断开的连接,但由于未通知 mod_dbd,因此准备好的 statements 将无效。

    安全警告

    任何 web/database application 都需要保护自己免受 SQL 注入攻击。在大多数情况下,Apache DBD 是安全的,因为 applications 使用准备好的 statements,不受信任的输入只被用作数据。当然,如果您通过 third-party 模块使用它,您应该确定它们可能需要的预防措施。

    但是,FreeTDS 驱动程序本质上是不安全的**。底层 library 不支持准备好的 statements,因此驱动程序会模拟它们,并且不受信任的输入将合并到 SQL 语句中。

    它可以通过取消所有输入来保证安全:一个受 Perl 污点检查启发的过程。根据 Perl 习语,每个输入都与正则表达式匹配,并且只使用 match:

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

    要使用此功能,必须在配置的准备好的 statements 中包含无效的正则表达式。正则表达式紧跟在预准备语句中的%之后,并用大括号{}括起来。例如,如果您的 application 需要字母数字输入,您可以使用:

    "SELECT foo FROM bar WHERE input =%s"

    与其他驱动程序,并没有比失败的查询更糟糕的事情。但是使用 FreeTDS 你需要:

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

    现在,任何不匹配正则表达式的$1 match 的东西都会被丢弃,因此该语句是安全的。

    另一种方法可能是 third-party ODBC 驱动程序,它提供了真正准备的 statements 的安全性。

    DBDExptime 指令

    描述:Keepalive time 用于 idle 连接
    句法:DBDExptime time-in-seconds
    默认:DBDExptime 300
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    设置 time 以在超过 DBDKeep 中指定的连接数时保持 idle 连接处于活动状态(仅限线程平台)。

    DBDInitSQL 指令

    描述:连接到数据库后执行 SQL 语句
    句法:DBDInitSQL "SQL statement"
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    希望它的模块可以在创建与数据库的连接时执行一个或多个 SQL statements。示例用法可能是在与数据库建立新连接时初始化某些值或添加 log 条目。

    DBDKeep 指令

    描述:最大持续连接数
    句法:DBDKeep number
    默认:DBDKeep 2
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    设置每个 process 的最大连接数,而不是处理峰值需求(仅限线程平台)。

    DBDMax 指令

    描述:最大连接数
    句法:DBDMax number
    默认:DBDMax 10
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    设置每个 process 的最大连接数(仅限螺纹平台)。

    DBDMin 指令

    描述:最小连接数
    句法:DBDMin number
    默认:DBDMin 1
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    设置每个 process 的最小连接数(仅限螺纹平台)。

    DBDParams 指令

    描述:数据库连接的参数
    句法:DBDParams param1=value1[,param2=value2]
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    根据底层驱动程序的要求。通常,这将用于传递无法在用户名,密码,数据库 name,主机名和 port 号码之间进行默认的任何连接。

    当前驱动程序的连接 string 参数包括:

    • FreeTDS(适用于 MSSQL 和 SyBase)
      用户名,密码,appname,dbname,host,charset,lang,server
    • MySQL
      host, port,user,pass,dbname,sock,flags,fldsz,group,reconnect
    • 神谕
      用户,传递,dbname,服务器
    • PostgreSQL
      连接 string 直接传递给 PQconnectdb
    • SQLite2
      连接 string 在冒号上拆分,part1:part2 用作 sqlite_open(part1,atoi(part2),NULL)
    • sqlite3
      连接 string 直接传递给 sqlite3_open
    • ODBC
      数据源,用户,密码,连接,ctimeout,stimeout,访问,txmode,bufsize

    DBDPersist 指令

    描述:是否使用持久连接
    句法:DBDPersist On\|Off
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    如果设置为 Off,则禁用持久性和池化连接。当 client 请求时,将打开一个新的数据库连接,并在发布时立即关闭。此选项用于调试和 low-usage 服务器。

    缺省情况是启用持久连接池(如果是 non-threaded 服务器,则启用单个 LAMP-style 持久连接),并且几乎总是在操作中使用。

    在 version 2.2.2 之前,该指令仅接受值01而不是OffOn

    DBDPrepareSQL 指令

    描述:定义 SQL 预准备语句
    句法:DBDPrepareSQL "SQL statement" label
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    对于重复使用单个 SQL 语句的身份验证等模块,可以通过在启动时准备语句而不是每次使用它来实现最佳 performance。该指令准备 SQL 语句并为其分配标签。

    DBDriver 指令

    描述:指定 SQL 驱动程序
    句法:DBDriver name
    Context:server config,virtual host
    状态:延期
    模块:mod_dbd

    按 name 选择 apr_dbd 驱动程序。必须在系统上安装驱动程序(在大多数系统上,它将是共享的 object 或 dll)。例如,DBDriver mysql将在 apr_dbd_mysql.so 中选择 MySQL 驱动程序。

    上篇:mod_dav_lock

    下篇:mod_deflate