33.1. 数据库连接控制功能

以下功能处理与 PostgreSQL 后端服务器的连接。一个应用程序可以一次打开多个后端连接。 (这样做的一个原因是要访问多个数据库.)每个连接都由一个PGconn 对象表示,该对象是从函数PQconnectdbPQconnectdbParamsPQsetdbLogin获得的。请注意,这些函数将始终返回非空对象指针,除非可能甚至没有太多的内存来分配PGconn对象。在通过连接对象发送查询之前,应调用PQstatus函数以检查返回值是否成功连接。

Warning

如果不受信任的用户可以访问未采用安全模式使用模式的数据库,请通过从search_path删除可公开写模式来开始每个会话。可以将参数关键字options设置为值-csearch_path=。或者,可以在连接后发出PQexec(conn, "SELECT pg_catalog.set_config('search_path', '', false)")。这种考虑并非特定于 libpq;它适用于执行任意 SQL 命令的每个接口。

Warning

在 Unix 上,因为父进程和子进程共享相同的套接字和 os 资源,所以使用开放的 libpq 连接分叉进程可能导致无法预测的结果。因此,尽管从子进程执行exec来加载新的可执行文件是安全的,但不建议使用这种用法。

Note

在 Windows 上,如果重复启动和关闭单个数据库连接,则有一种提高性能的方法。在内部,libpq 分别调用WSAStartup()WSACleanup()来启动和关闭连接。 WSAStartup()递增内部 Windows 库引用计数,递减WSACleanup()。当引用计数仅为 1 时,调用WSACleanup()将释放所有资源,并卸载所有 DLL。这是一个昂贵的操作。为避免这种情况,应用程序可以手动调用WSAStartup(),因此在最后一个数据库连接关闭时不会释放资源。

  • PQconnectdbParams
    • 与数据库服务器构建新连接。
PGconn *PQconnectdbParams(const char * const *keywords,
                          const char * const *values,
                          int expand_dbname);

此函数使用从两个NULL终止的数组中获取的参数来打开新的数据库连接。第一个keywords定义为字符串数组,每个字符串都是一个关键字。第二个values给出每个关键字的值。与下面的PQsetdbLogin不同,可以在不更改功能签名的情况下扩展参数集,因此对于新的应用程序编程,首选使用此功能(或其无阻塞模拟PQconnectStartParamsPQconnectPoll)。

当前识别的参数关键字在Section 33.1.2中列出。

expand_dbname非零时,* dbname 关键字值被允许识别为连接字符串。这样只会扩展 dbname 的第一个出现,随后的 dbname *值将作为纯数据库名称进行处理。有关可能的连接字符串格式的更多详细信息,请参见Section 33.1.1

传递的数组可以为空以使用所有默认参数,也可以包含一个或多个参数设置。它们的长度应匹配。处理将在keywords数组中的第一个NULL元素处停止。

如果任何参数是NULL或空字符串,那么将检查相应的环境变量(请参见Section 33.14)。如果也未设置环境变量,那么将使用指示的内置默认值。

通常,从这些数组的开头开始按索引 Sequences 处理关键字。这样的效果是,当重复关键词时,将保留最后处理的值。因此,通过仔细放置* dbname 关键字,可以确定 conninfo *字符串可以覆盖哪些内容,哪些不能覆盖。

  • PQconnectdb
    • 与数据库服务器构建新连接。
PGconn *PQconnectdb(const char *conninfo);

此函数使用从字符串conninfo取得的参数打开新的数据库连接。

传递的字符串可以为空以使用所有默认参数,或者可以包含一个或多个用空格分隔的参数设置,或者可以包含 URI。有关详情,请参见Section 33.1.1

  • PQsetdbLogin
    • 与数据库服务器构建新连接。
PGconn *PQsetdbLogin(const char *pghost,
                     const char *pgport,
                     const char *pgoptions,
                     const char *pgtty,
                     const char *dbName,
                     const char *login,
                     const char *pwd);

这是PQconnectdb的前身,它具有一组固定的参数。它具有相同的功能,只是缺少的参数将始终采用默认值。为任何默认的固定参数写NULL或一个空字符串。

如果* dbName 包含=符号或具有有效的连接 URI 前缀,则将其当作 conninfo *字符串,使用方式与传递给PQconnectdb的方式完全相同,然后按照指定的方式应用其余参数PQconnectdbParams

  • PQsetdb
    • 与数据库服务器构建新连接。
PGconn *PQsetdb(char *pghost,
                char *pgport,
                char *pgoptions,
                char *pgtty,
                char *dbName);

这是一个宏,它使用* login pwd *参数的空指针调用PQsetdbLogin。提供它是为了与非常老的程序向后兼容。

  • PQconnectStartParams
    PQconnectStart
    PQconnectPoll
    • 以非阻塞方式构建与数据库服务器的连接。
PGconn *PQconnectStartParams(const char * const *keywords,
                             const char * const *values,
                             int expand_dbname);

PGconn *PQconnectStart(const char *conninfo);

PostgresPollingStatusType PQconnectPoll(PGconn *conn);

这三个功能用于打开与数据库服务器的连接,从而在执行此操作时,不会在远程 I/O 上阻止应用程序的执行线程。这种方法的重点在于,awaitI/O 完成的过程可以发生在应用程序的主循环中,而不是发生在PQconnectdbParamsPQconnectdb内部,因此应用程序可以与其他活动并行 Management 此操作。

使用PQconnectStartParams时,使用从keywordsvalues数组中获取并由expand_dbname控制的参数进行数据库连接,如上面针对PQconnectdbParams所述。

使用PQconnectStart时,使用从字符串conninfo取得的参数构建数据库连接,如上面针对PQconnectdb所述。

只要满足许多限制,PQconnectStartParamsPQconnectStartPQconnectPoll都不会阻塞:

  • 必须正确使用hostaddr参数以防止进行 DNS 查询。有关详细信息,请参见Section 33.1.2中此参数的文档。

  • 如果调用PQtrace,请确保您跟踪到的流对象不会被阻塞。

  • 如下所述,必须在调用PQconnectPoll之前确保套接字处于适当的状态。

要开始无阻塞连接请求,请致电PQconnectStartPQconnectStartParams。如果结果为 null,则 libpq 无法分配新的PGconn结构。否则,将返回有效的PGconn指针(尽管尚未表示与数据库的有效连接)。下次通话PQstatus(conn)。如果结果为CONNECTION_BAD,则连接尝试已经失败,通常是由于无效的连接参数所致。

如果PQconnectStartPQconnectStartParams成功,则下一步是轮询 libpq,以便它可以 continue 进行连接序列。使用PQsocket(conn)获取数据库连接基础的套接字的 Descriptors。 (警告:请勿假定PQconnectPoll调用之间的套接字保持不变.)因此循环:如果PQconnectPoll(conn)最后返回PGRES_POLLING_READING,请 await 直到套接字准备好读取(如select()poll()或类似的系统功能所示)。然后再次致电PQconnectPoll(conn)。相反,如果PQconnectPoll(conn)最后返回PGRES_POLLING_WRITING,请 await 套接字准备好写入,然后再次调用PQconnectPoll(conn)。在第一次迭代中,即,如果您尚未调用PQconnectPoll,则其行为就像最后一次返回PGRES_POLLING_WRITING一样。continue 此循环,直到PQconnectPoll(conn)返回PGRES_POLLING_FAILED(表示连接过程已失败)或PGRES_POLLING_OK(表示连接已成功构建)。

在连接期间的任何时间,都可以通过调用PQstatus来检查连接的状态。如果此调用返回CONNECTION_BAD,则连接过程失败;否则,连接过程将失败。如果调用返回CONNECTION_OK,则连接已准备就绪。从如上所述的PQconnectPoll的返回值可以相等地检测到这两个状态。其他状态也可能在异步连接过程中(并且仅在此过程中)发生。这些指示连接过程的当前阶段,并且可能有助于例如向用户提供反馈。这些状态是:

  • CONNECTION_STARTED
    • await 构建连接。

    • CONNECTION_MADE

      • 连接正常;await 发送。
    • CONNECTION_AWAITING_RESPONSE

      • await 服务器的响应。
    • CONNECTION_AUTH_OK

      • 收到认证;await 后端启动完成。
    • CONNECTION_SSL_STARTUP

      • 协商 SSL 加密。
    • CONNECTION_SETENV

      • 协商环境驱动的参数设置。
    • CONNECTION_CHECK_WRITABLE

      • 检查连接是否能够处理写事务。
    • CONNECTION_CONSUME

      • 消耗连接上所有剩余的响应消息。

请注意,尽管将保留这些常量(以保持兼容性),但应用程序永远不应依赖于以特定 Sequences 出现的常量,或者根本不依赖于这些记录值之一的状态。应用程序可能会执行以下操作:

switch(PQstatus(conn))
{
        case CONNECTION_STARTED:
            feedback = "Connecting...";
            break;

        case CONNECTION_MADE:
            feedback = "Connected to server...";
            break;
.
.
.
        default:
            feedback = "Connecting...";
}

使用PQconnectPoll时将忽略connect_timeout连接参数;应用程序有责任确定是否已花费过多时间。否则,PQconnectStart后跟PQconnectPoll循环等效于PQconnectdb

请注意,当PQconnectStartPQconnectStartParams返回非空指针时,必须在处理完PQfinish后调用PQfinish,以便处理该结构和任何关联的内存块。即使连接尝试失败或被放弃,也必须这样做。

  • PQconndefaults
    • 返回默认的连接选项。
PQconninfoOption *PQconndefaults(void);

typedef struct
{
    char   *keyword;   /* The keyword of the option */
    char   *envvar;    /* Fallback environment variable name */
    char   *compiled;  /* Fallback compiled in default value */
    char   *val;       /* Option's current value, or NULL */
    char   *label;     /* Label for field in connect dialog */
    char   *dispchar;  /* Indicates how to display this field
                          in a connect dialog. Values are:
                          ""        Display entered value as is
                          "*"       Password field - hide value
                          "D"       Debug option - don't show by default */
    int     dispsize;  /* Field size in characters for dialog */
} PQconninfoOption;

返回连接选项数组。这可用于确定所有可能的PQconnectdb选项及其当前默认值。返回值指向PQconninfoOption结构的数组,该数组以带有空keyword指针的条目结尾。如果无法分配内存,则返回空指针。请注意,当前默认值(val字段)将取决于环境变量和其他上下文。丢失或无效的服务文件将被静默忽略。呼叫者必须将连接选项数据视为只读。

处理 options 数组后,将其传递给PQconninfoFree以释放它。如果不这样做,则每次对PQconndefaults的调用都会泄漏少量内存。

  • PQconninfo
    • 返回实时连接使用的连接选项。
PQconninfoOption *PQconninfo(PGconn *conn);

返回连接选项数组。这可以用来确定所有可能的PQconnectdb选项以及用于连接到服务器的值。返回值指向PQconninfoOption结构的数组,该数组以带有空keyword指针的条目结尾。上面针对PQconndefaults的所有 Comments 也适用于PQconninfo的结果。

  • PQconninfoParse
    • 从提供的连接字符串中返回已解析的连接选项。
PQconninfoOption *PQconninfoParse(const char *conninfo, char **errmsg);

解析连接字符串并以数组形式返回结果选项;或如果连接字符串有问题,则返回NULL。此函数可用于提取提供的连接字符串中的PQconnectdb选项。返回值指向PQconninfoOption结构的数组,该数组的结尾是具有空keyword指针的条目。

所有合法选项将出现在结果数组中,但是连接字符串中不存在的任何选项的PQconninfoOptionval设置为NULL;未插入默认值。

如果errmsg不是NULL,则成功时将*errmsg设置为NULL,否则设置为malloc d 错误字符串以说明问题。 (也可以将*errmsg设置为NULL,并且该函数返回NULL;这表明内存不足.)

处理 options 数组后,将其传递给PQconninfoFree以释放它。如果不这样做,每次调用PQconninfoParse都会泄漏一些内存。相反,如果发生错误并且errmsg不是NULL,请确保使用PQfreemem释放错误字符串。

  • PQfinish
    • 关闭与服务器的连接。同时释放PGconn对象使用的内存。
void PQfinish(PGconn *conn);

请注意,即使服务器连接尝试失败(如PQstatus所示),应用程序也应调用PQfinish以释放PGconn对象使用的内存。在调用PQfinish之后,不得再次使用PGconn指针。

  • PQreset
    • 将通信通道重置为服务器。
void PQreset(PGconn *conn);

该功能将关闭与服务器的连接,并尝试使用以前使用的所有相同参数来重新构建与同一服务器的新连接。如果工作连接丢失,这对于恢复错误可能很有用。

  • PQresetStart
    PQresetPoll
    • 以无阻塞方式重置与服务器的通信通道。
int PQresetStart(PGconn *conn);

PostgresPollingStatusType PQresetPoll(PGconn *conn);

这些功能将关闭与服务器的连接,并尝试使用以前使用的所有相同参数重新构建与同一服务器的新连接。如果失去有效的连接,这对于恢复错误很有用。它们与PQreset(以上)的不同之处在于它们以非阻塞方式运行。这些功能受到与PQconnectStartParamsPQconnectStartPQconnectPoll相同的限制。

要启动连接重置,请致电PQresetStart。如果返回 0,则重置失败。如果返回 1,则使用与使用PQconnectPoll创建连接完全相同的方式使用PQresetPoll轮询重置。

  • PQpingParams
    • PQpingParams报告服务器的状态。它接受与上述PQconnectdbParams相同的连接参数。无需提供正确的用户名,密码或数据库名称值即可获取服务器状态;但是,如果提供的值不正确,服务器将记录失败的连接尝试。
PGPing PQpingParams(const char * const *keywords,
                    const char * const *values,
                    int expand_dbname);

该函数返回以下值之一:

  • PQPING_OK

    • 服务器正在运行,并且似乎正在接受连接。

    • PQPING_REJECT

      • 服务器正在运行,但处于不允许连接的状态(启动,关闭或崩溃恢复)。
    • PQPING_NO_RESPONSE

      • 无法联系服务器。这可能表明服务器未在运行,或者给定的连接参数有问题(例如,错误的端口号),或者存在网络连接问题(例如,防火墙阻止了连接请求)。
    • PQPING_NO_ATTEMPT

      • 没有尝试与服务器联系,因为提供的参数显然不正确或存在一些 Client 端问题(例如,内存不足)。
  • PQping

    • PQping报告服务器的状态。它接受与上述PQconnectdb相同的连接参数。无需提供正确的用户名,密码或数据库名称值即可获取服务器状态;但是,如果提供的值不正确,服务器将记录失败的连接尝试。
PGPing PQping(const char *conninfo);

返回值与PQpingParams相同。

33 .1.1. 连接字符串

几个 libpq 函数解析用户指定的字符串以获得连接参数。这些字符串有两种可接受的格式:纯keyword = value字符串和 URI。 URI 通常遵循RFC 3986,除了允许多主机连接字符串,如下所述。

33 .1.1.1. 关键字/值连接字符串

在第一种格式中,每个参数设置的格式均为keyword = value。等号周围的空格是可选的。要写入空值或包含空格的值,请用单引号将其括起来,例如keyword = 'a value'。值中的单引号和反斜杠必须使用反斜杠转义,即\'\\

Example:

host=localhost port=5432 dbname=mydb connect_timeout=10

可识别的参数关键字在Section 33.1.2中列出。

33 .1.1.2. 连接 URI

连接 URI 的一般形式为:

postgresql://[user[:password]@][netloc][:port][,...][/dbname][?param1=value1&...]

URI 方案指示符可以是postgresql://postgres://。每个 URI 部分都是可选的。以下示例说明了有效的 URI 语法用法:

postgresql://
postgresql://localhost
postgresql://localhost:5433
postgresql://localhost/mydb
postgresql://user@localhost
postgresql://user:secret@localhost
postgresql://other@localhost/otherdb?connect_timeout=10&application_name=myapp
postgresql://host1:123,host2:456/somedb?target_session_attrs=any&application_name=myapp

URI 的层次部分的组件也可以作为参数给出。例如:

postgresql:///mydb?host=localhost&port=5433

百分比编码可用于在任何 URI 部分(例如,将=替换为%3D

Section 33.1.2中列出的关键字不对应的所有连接参数都将被忽略,有关它们的警告消息将发送到stderr

为了改善与 JDBC 连接 URI 的兼容性,将参数ssl=true的实例转换为sslmode=require

主机部分可以是主机名或 IP 地址。要指定 IPv6 主机地址,请将其括在方括号中:

postgresql://[2001:db8::1234]/database

主机组件的解释如参数host所述。特别是,如果主机部分为空或以斜杠开头,则选择 Unix 域套接字连接,否则将启动 TCP/IP 连接。但是请注意,斜杠是 URI 层次结构部分中的保留字符。因此,要指定非标准的 Unix 域套接字目录,请在 URI 中省略主机规范,并将主机指定为参数,或者在 URI 的主机组件中对路径进行百分比编码:

postgresql:///dbname?host=/var/lib/postgresql
postgresql://%2Fvar%2Flib%2Fpostgresql/dbname

可以在单个 URI 中指定多个主机组件,每个主机组件都带有一个可选的端口组件。形式为postgresql://host1:port1,host2:port2,host3:port3/的 URI 等效于形式为host=host1,host2,host3 port=port1,port2,port3的连接字符串。将依次尝试每个主机,直到成功构建连接。

33 .1.1.3. 指定多个主机

可以指定要连接的多个主机,以便按给定 Sequences 尝试它们。在关键字/值格式中,hosthostaddrport选项接受以逗号分隔的值列表。在指定的每个选项中必须给定相同数量的元素,例如第一个hostaddr对应于第一个主机名,第二个hostaddr对应于第二个主机名,依此类推。作为 exception,如果仅指定一个port,则它将应用于所有主机。

在连接 URI 格式中,您可以在 URI 的host组件中列出多个以逗号分隔的host:port对。

无论采用哪种格式,单个主机名都可以转换为多个网络地址。一个常见的示例是同时具有 IPv4 和 IPv6 地址的主机。

指定多个主机时,或将一个主机名转换为多个地址时,将按 Sequences 尝试所有主机和地址,直到成功为止。如果无法访问任何主机,则连接失败。如果构建连接成功,但是身份验证失败,则列表中的其余主机不会尝试。

如果使用密码文件,则可以为不同的主机使用不同的密码。列表中的每个主机的所有其他连接选项相同。例如,不可能为不同的主机指定不同的用户名。

33 .1.2. 参数关键字

当前公认的参数关键字是:

  • host
    • 要连接的主机名。 如果主机名以斜杠开头,则它指定 Unix 域通信而不是 TCP/IP 通信;该值是存储套接字文件的目录的名称。未指定host或为空时的默认行为是连接到/tmp中的 Unix 域套接字(或构建 PostgreSQL 时指定的任何套接字目录)。在没有 Unix 域套接字的计算机上,默认设置是连接到localhost

还接受以逗号分隔的主机名列表,在这种情况下,将按 Sequences 尝试列表中的每个主机名;列表中的空白项将选择默认行为,如上所述。有关详情,请参见Section 33.1.1.3

  • hostaddr
    • 要连接的主机的 IP 地址。该格式应为标准的 IPv4 地址格式,例如172.28.40.9。如果您的计算机支持 IPv6,则也可以使用这些地址。当为此参数指定非空字符串时,始终使用 TCP/IP 通信。

使用hostaddr而不是host可以使应用程序避免查找主机名,这在有时间限制的应用程序中可能很重要。但是,对于 GSSAPI 或 SSPI 身份验证方法以及verify-full SSL 证书验证,主机名是必需的。使用以下规则:

  • 如果指定的host不带hostaddr,则会进行主机名查找。 (使用PQconnectPoll时,在PQconnectPoll首先考虑此主机名时会进行查找,这可能会导致PQconnectPoll阻塞相当长的时间.)

  • 如果指定的hostaddr不带host,则hostaddr的值给出服务器的网络地址。如果身份验证方法需要主机名,则连接尝试将失败。

  • 如果同时指定了hosthostaddr,则hostaddr的值将提供服务器网络地址。除非身份验证方法要求host的值,否则它将被忽略,在这种情况下它将用作主机名。

请注意,如果host不是网络地址hostaddr上的服务器名称,则身份验证很可能会失败。另外,同时指定hosthostaddr时,使用host标识密码文件中的连接(请参见Section 33.15)。

还接受以逗号分隔的hostaddr值列表,在这种情况下,列表中的每个主机将按 Sequences 尝试。列表中的空白项将导致使用相应的主机名,如果默认的主机名也为空,则使用该默认主机名。有关详情,请参见Section 33.1.1.3

如果没有主机名或主机地址,libpq 将使用本地 Unix 域套接字进行连接。或在没有 Unix 域套接字的计算机上,它将尝试连接到localhost

  • port

    • 要在服务器主机上连接的端口号,或用于 Unix 域连接的套接字文件 extensions。 如果在hosthostaddr参数中指定了多个主机,则此参数可以指定与主机列表长度相同的逗号分隔的端口列表,也可以指定用于所有主机的单个端口号。空字符串或逗号分隔列表中的空项目指定在构建 PostgreSQL 时构建的默认端口号。
  • dbname

    • 数据库名称。默认值与用户名相同。在某些情况下,将检查值的扩展格式;有关详情,请参见Section 33.1.1
  • user

    • PostgreSQL 用户名作为连接。默认值与运行应用程序的用户的 os 名称相同。
  • password

    • 如果服务器要求密码验证,则使用密码。
  • passfile

    • 指定用于存储密码的文件的名称(请参阅Section 33.15)。在 Microsoft Windows 上默认为~/.pgpass%APPDATA%\postgresql\pgpass.conf。 (如果此文件不存在,则不会报告错误.)
  • connect_timeout

    • 最大 await 连接时间,以秒为单位(以十进制整数形式编写,例如10)。零,负数或未指定意味着无限期 await。允许的最小超时为 2 秒,因此1的值被解释为2。此超时分别适用于每个主机名或 IP 地址。例如,如果您指定两个主机且connect_timeout为 5,则如果 5 秒钟内未构建连接,则每个主机都将超时,因此 await 连接所花费的总时间可能最多为 10 秒。
  • client_encoding

    • 这将为此连接设置client_encoding配置参数。除了相应的服务器选项接受的值之外,还可以使用auto从 Client 机中的当前语言环境(在 Unix 系统上为LC_CTYPE环境变量)确定正确的编码。
  • options

    • 指定在连接开始时发送到服务器的命令行选项。例如,将此设置为-c geqo=off会将geqo参数的会话值设置为off。除非使用反斜杠(\)进行转义,否则该字符串内的空格将被视为分隔命令行参数。写\\代表 Literals 反斜杠。有关可用选项的详细讨论,请咨询Chapter 19
  • application_name

  • fallback_application_name

    • application_name配置参数指定一个后备值。如果未通过连接参数或PGAPPNAME环境变量为application_name提供任何值,则将使用此值。指定后备名称在希望设置默认应用程序名称但允许用户覆盖默认应用程序名称的通用 Util 中很有用。
  • keepalives

    • 控制是否使用 Client 端 TCP Keepalive。默认值为 1,表示打开,但如果不需要保持活动状态,则可以将其更改为 0,表示关闭。对于通过 Unix 域套接字构建的连接,将忽略此参数。
  • keepalives_idle

    • 控制不活动的秒数,在此之后,TCP 应该向服务器发送保持活动消息。零值使用系统默认值。对于通过 Unix 域套接字构建的连接,或者如果禁用 keepalive,则忽略此参数。仅在具有TCP_KEEPIDLE或等效套接字选项的系统以及 Windows 上才支持。在其他系统上,它没有任何作用。
  • keepalives_interval

    • 控制秒数,在该秒数之后,应重新传输服务器未确认的 TCP Keepalive 消息。零值使用系统默认值。对于通过 Unix 域套接字构建的连接,或者如果禁用 keepalive,则忽略此参数。仅在具有TCP_KEEPINTVL或等效套接字选项的系统以及 Windows 上才支持。在其他系统上,它没有任何作用。
  • keepalives_count

    • 控制在 Client 端与服务器的连接被视为无效之前可能丢失的 TCP keepalive 数量。零值使用系统默认值。对于通过 Unix 域套接字构建的连接,或者如果禁用 keepalive,则忽略此参数。仅在具有TCP_KEEPCNT或等效套接字选项的系统上受支持;在其他系统上,它没有任何作用。
  • tty

    • 被忽略(以前,此选项指定将服务器调试输出发送到的位置)。
  • sslmode

    • 此选项确定是否与服务器协商安全 SSL TCP/IP 连接的优先级或优先级。有六种模式:
  • disable

    • 仅尝试非 SSL 连接

    • allow

      • 首先尝试非 SSL 连接;如果失败,请尝试进行 SSL 连接
    • prefer(默认)

      • 首先尝试 SSL 连接;如果失败,请尝试使用非 SSL 连接
    • require

      • 仅尝试使用 SSL 连接。如果存在根 CA 文件,则以与指定verify-ca相同的方式验证证书
    • verify-ca

      • 仅尝试使用 SSL 连接,并验证服务器证书是由受信任的证书颁发机构(CA)颁发的
    • verify-full

      • 仅尝试使用 SSL 连接,验证服务器证书是由受信任的 CA 颁发的,并且所请求的服务器主机名与证书中的名称匹配

有关这些选项如何工作的详细说明,请参见Section 33.18

Unix 域套接字通信将忽略sslmode。如果 PostgreSQL 编译时没有 SSL 支持,则使用选项requireverify-caverify-full会导致错误,而选项allowprefer会被接受,但 libpq 实际上不会尝试进行 SSL 连接。

  • requiressl
    • 不建议使用此选项,而推荐使用sslmode设置。

如果设置为 1,则需要与服务器构建 SSL 连接(相当于sslmode require)。如果服务器不接受 SSL 连接,那么 libpq 将拒绝连接。如果设置为 0(默认值),libpq 将与服务器协商连接类型(等效于sslmode prefer)。仅当 PostgreSQL 使用 SSL 支持编译时,此选项才可用。

  • sslcompression
    • 如果设置为 1(默认),则将压缩通过 SSL 连接发送的数据。如果设置为 0,将禁用压缩(这需要 OpenSSL 1.0.0 或更高版本)。如果构建没有 SSL 的连接,或者使用的 OpenSSL 版本不支持此参数,则忽略此参数。

压缩占用 CPU 时间,但是如果网络是瓶颈,则压缩可以提高吞吐量。如果 CPU 性能是限制因素,则禁用压缩可以改善响应时间和吞吐量。

  • sslcert

    • 此参数指定 Client 端 SSL 证书的文件名,以替换默认的~/.postgresql/postgresql.crt。如果未构建 SSL 连接,则忽略此参数。
  • sslkey

    • 此参数指定用于 Client 端证书的密钥的位置。它可以指定将使用的文件名代替默认的~/.postgresql/postgresql.key,也可以指定从外部“引擎”获得的密钥(引擎是可加载 OpenSSL 的模块)。外部引擎规范应由冒号分隔的引擎名称和特定于引擎的键标识符组成。如果未构建 SSL 连接,则忽略此参数。
  • sslrootcert

    • 此参数指定包含 SSL 证书颁发机构(CA)证书的文件的名称。如果该文件存在,则将验证服务器的证书是否已由这些机构之一签名。默认值为~/.postgresql/root.crt
  • sslcrl

    • 此参数指定 SSL 证书吊销列表(CRL)的文件名。该文件中列出的证书(如果存在)在尝试验证服务器证书时将被拒绝。默认值为~/.postgresql/root.crl
  • requirepeer

    • 此参数指定服务器的 os 用户名,例如requirepeer=postgres。进行 Unix 域套接字连接时,如果设置了此参数,则 Client 端将在连接开始时检查服务器进程是否以指定的用户名运行;如果不是,则连接因错误而中止。此参数可用于提供服务器身份验证,类似于 TCP/IP 连接上的 SSL 证书可用的服务器身份验证。 (请注意,如果 Unix 域套接字位于/tmp或其他可公共写入的位置,则任何用户都可以在该位置启动服务器侦听.使用此参数可确保您已连接到由受信任用户运行的服务器.)仅此选项。在实现peer身份验证方法的平台上受支持;参见Section 20.3.6
  • krbsrvname

    • 使用 GSSAPI 进行身份验证时要使用的 Kerberos 服务名称。此名称必须与服务器配置中指定的服务名称匹配,以使 Kerberos 身份验证成功。 (另请参见Section 20.3.3。)
  • gsslib

    • 用于 GSSAPI 身份验证的 GSS 库。当前,除了包含 GSSAPI 和 SSPI 支持的 Windows 版本外,这都可以忽略。在这种情况下,请将其设置为gssapi以使 libpq 使用 GSSAPI 库而不是默认的 SSPI 进行身份验证。
  • service

    • 用于其他参数的服务名称。它在pg_service.conf中指定一个服务名称,其中包含其他连接参数。这允许应用程序仅指定服务名称,以便可以集中维护连接参数。参见Section 33.16
  • target_session_attrs

    • 如果此参数设置为read-write,则仅默认接受接受读写事务的连接。成功连接后将发送查询SHOW transaction_read_only;如果返回on,则连接将关闭。如果在连接字符串中指定了多个主机,则将尝试其余所有服务器,就像连接尝试失败一样。此参数的默认值any将所有连接视为可接受。