网页
综合
更新时间 2026-11-13 19:43:27
33.1. 数据库连接控制函数
自动蜘蛛
www.runoob.com
正文约 4456 字
下列函数会建立到一个PostgreSQL后端服务器的连接。一个应用程序可以在一个时刻打开多个后端连接(原因之一就是为了访问多个数据库)。每个连接用一个PGconn对象表示,它从函数PQconnectdb、PQconnectdbParams或PQsetdbLogin得到。注意这些函数将总是返回一个非空的对象指针,除非正好没有内存来分配PGconn对象。在通过该连接对象发送查询之前,应该调用PQstatus函数来检查返回值以确定是否得到了一个成功的连接。
在 Unix 上,复制一个拥有打开 libpq 连接的进程可能导致不可以预料的结果,因为父进程和子进程会共享相同的套接字和操作系统资源。出于这个原因,我们不推荐这样的用法,尽管从子进程执行一个exec来载入新的可执行代码是安全的。
在 Windows 上,如果一个单一数据库连接被反复地开启并且关闭,这是一种提升性能的方式。在内部,libpq 为开启和关闭分别调用WSAStartup()和WSACleanup()。WSAStartup()会增加一个内部 Windows 库引用计数而WSACleanup()则会减少之。当引用计数正好为一时,调用WSACleanup()会释放所有资源并且所有 DLL 会被卸载。这是一种昂贵的操作。为了避免它,一个应用可以手动调用WSAStartup(),这样当最后的数据库连接被关闭时资源不会被释放。
这个函数使用从两个以NULL结尾的数组中取得的参数打开一个新的数据库连接。第一个数组keywords被定义为一个字符串数组,每一个元素是一个关键词。第二个数组values给出了每个关键词的值。和下面的PQsetdbLogin不同,可以在不改变函数签名的情况下扩展参数集合,因此使用这个函数(或者与之相似的非阻塞的PQconnectStartParams和PQconnectPoll)对于新应用编程要更好。
当前能被识别的参数关键词被列举在第 33.1.2 节中。
其可能的格式详见第 33.1.1 节。 当expand_dbname为非零时,dbname 关键词的值被允许识别为一个连接字符串。只有dbname 的第一次出现会按这种方式扩展,任何后续dbname值会被当 做一个普通数据库名处理。有关可能的连接字符串格式的详情可见 第 33.1.1 节。
被传递的数组可以为空,这样就会使用所有默认参数。也可以只包含一个或几个参数设置。两个参数数组应该在长度上匹配。对于参数数组的处理将会停止于keywords数组中第一个非-NULL元素。
如果任何一个参数是NULL或者一个空字符串, 那么将会检查相应的环境变量(见第 33.14 节)。 如果该环境变量也没有被设置,那么将使用指示的内建默认值。
通常,关键词的处理是从这些数组的头部开始并且以索引顺序进行。这样做的效果就是,当关键词有重复时,只会保留最后一个被处理的值。因此,通过小心地放置关键词dbname,可以决定什么会被一个conninfo字符串所重载,以及什么不会被重载。
这个函数使用从字符串conninfo中得到的参数开启一个新的数据库连接。
被传递的字符串可以为空,这样将会使用所有的默认参数。也可以包含由空格分隔的一个或多个参数设置,还可以包含一个URI。详见第 33.1.1 节。
这是PQconnectdb的带有固定参数集合的前辈。它具有相同的功能,不过其中缺失的参数将总是采用默认值。对任意一个固定参数写NULL或一个空字符串将会使它采用默认值。
如果dbName包含一个=符号或者具有一个合法的连接URI前缀,它会被当作一个conninfo字符串,就好像它已经被传递给了PQconnectdb,并且剩余的参数则被应用为指定给PQconnectdbParams。
这是一个调用PQsetdbLogin的宏,其中为login和pwd参数使用空指针。提供它是为了向后兼容非常老的程序。
以非阻塞的方式建立一个到数据库服务器的连接。
这三个函数被用来开启一个到数据库服务器的连接,这样你的应用的执行线程不会因为远程的I/O而被阻塞。这种方法的要点在于等待 I/O 完成可能在应用的主循环中发生,而不是在PQconnectdbParams或PQconnectdb中,并且因此应用能够把这种操作和其他动作并行处理。
在PQconnectStartParams中,数据库连接使用从keywords和values数组中取得的参数创建,并且被expand_dbname控制,这和之前描述的PQconnectdbParams相同。
在PQconnectStart中,数据库连接使用从字符串conninfo中取得的参数创建,这和之前描述的PQconnectdb相同。
只要满足一些限制,PQconnectStartParams或PQconnectStart或PQconnectPoll都不会阻塞:
hostaddr和host参数被合适地使用,以确保不会做名字或逆向名字查询。详见第 33.1.2 节中这些参数的文档。
如果你调用PQtrace,确保你追踪的该流对象不会阻塞。
如后文所述,你要确保在调用PQconnectPoll之前,套接字处于合适的状态。
注意:PQconnectStartParams的使用和下文所示的PQconnectStart类似。
要开始一个非阻塞的连接请求,可调用conn = PQconnectStart("connection_info_string")。如果conn为空,那么libpq无法分配一个新的PGconn结构。否则,一个合法的PGconn指针将被返回(尽管并不表示代表一个到数据库的合法连接)。在从PQconnectStart返回时,调用status = PQstatus(conn)。如果status等于CONNECTION_BAD,就说明PQconnectStart已经失败。
如果PQconnectStart成功,下一个阶段是轮询libpq,这样它能够继续进行连接序列。使用PQsocket(conn)来获得该数据库连接底层的套接字描述符。这样循环:如果PQconnectPoll(conn)上一次返回PGRES_POLLING_READING,等到该套接字准备好读取(按照select()、poll()或类似的系统函数所指示的)。则再次调用PQconnectPoll(conn)。反之,如果PQconnectPoll(conn)上一次返回PGRES_POLLING_WRITING,等到该套接字准备好写入,则再次调用PQconnectPoll(conn)。如果你还没有调用PQconnectPoll,即刚好在对PQconnectStart的调用之后,行为就像是它上次返回了PGRES_POLLING_WRITING。持续这个循环直到PQconnectPoll(conn)返回PGRES_POLLING_FAILED指示连接过程已经失败,或者返回PGRES_POLLING_OK指示连接已经被成功地建立。
在连接期间的任意时刻,该连接的状态可以通过调用PQstatus来检查。如果这个调用返回CONNECTION_BAD,那么连接过程已经失败。如果该调用返回CONNECTION_OK,则该连接已经准备好。如前所述,这些状态同样都可以从PQconnectPoll的返回值检测。在一个异步连接过程中(也只有在这个过程中)也可能出现其他状态。这些状态指示该连接过程的当前阶段,并且可能有助于为用户提供反馈。这些状态是:
注意,尽管这些常数将被保留(为了维护兼容性),一个应用永远不应该依赖这些状态按照特定顺序出现,或者根本就不依赖它们,或者不依赖状态总是这些文档中所说的值。一个应用可能做些这样的事情:
在使用PQconnectPoll时,连接参数connect_timeout会被忽略:判断是否超时是应用的责任。否则,PQconnectStart后面跟着后面跟着PQconnectPoll循环等效于PQconnectdb。
注意如果PQconnectStart返回一个非空的指针,你必须在用完它之后调用PQfinish来处理那些结构和任何相关的内存块。即使连接尝试失败或被放弃时也必须完成这些工作。
返回一个连接选项数组。这可以用来确定用于连接服务器的所有可能的PQconnectdb选项和它们的当前缺省值。返回值指向一个PQconninfoOption结构的数组,该数组以一个包含空keyword指针的条目结束。如果无法分配内存,则返回该空指针。注意当前缺省值(val域)将依赖于环境变量和其他上下文。一个缺失或者无效的服务文件将会被无声地忽略掉。调用者必须把连接选项当作只读对待。
在处理完选项数组后,把它交给PQconninfoFree释放。如果没有这么做, 每次调用PQconndefaults都会导致一小部分内存泄漏。
返回一个连接选项数组。这可以用来确定用于连接服务器的所有可能的PQconnectdb选项和它们的当前缺省值。返回值指向一个PQconninfoOption结构的数组,该数组以一个包含空keyword指针的条目结束。上述所有对于PQconndefaults的注解也适用于PQconninfo的结果。
返回从提供的连接字符串中解析到的连接选项。
解析一个连接字符串并且将结果选项作为一个数组返回,或者在连接字符串有问题时返回NULL。这个函数可以用来抽取所提供的连接字符串中的PQconnectdb选项。返回值指向一个PQconninfoOption结构的数组,该数组以一个包含空keyword指针的条目结束。
所有合法选项将出现在结果数组中,但是任何在连接字符串中没有出现的选项的PQconninfoOption的val会被设置为NULL,默认值不会被插入。
如果errmsg不是NULL,那么成功时*errmsg会被设置为NULL, 否则设置为被malloc过的错误字符串以说明该问题(也可以将*errmsg设置为NULL并且函数返回NULL,这表示一种内存耗尽的情况)。
在处理完选项数组后,把它交给PQconninfoFree释放。如果没有这么做, 每次调用PQconninfoParse都会导致一小部分内存泄漏。反过来,如果发生一个错误并且errmsg不是NULL,确保使用PQfreemem释放错误字符串。
关闭与服务器的连接。同时释放PGconn对象使用的内存。
注意,即使与服务器的连接尝试失败(由PQstatus指示),应用也应当调用PQfinish来释放PGconn对象使用的内存。不能在调用PQfinish之后再使用PGconn指针。
此函数将关闭与服务器的连接,并且使用所有之前使用过的参数尝试重新建立与同一个服务器的连接。这可能有助于在工作连接丢失后的错误恢复。
本页为82搜索生成的网页快照,内容来自站内索引;演示数据的原文链接仅作示例。