VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

使用LibPQ连接数据库

连接数据库

一个应用程序可以在一个时刻打开多个后端连接(原因之一就是为了访问多个数据库)。每个连接用一个PGconn对象表示,它从函数PQconnectdb、PQconnectdbParams或PQsetdbLogin得到。在通过该连接对象发送查询之前,应该调用PQstatus函数来检查返回值以确定是否得到了一个成功的连接。

#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

int
main(int argc, char **argv)
{
    const char *conninfo;
PGconn     *conn;
    conninfo = "user = vbadmin password = 1234Abcde dbname = vastbase";

    /* 建立到数据库的一个连接 */
    conn = PQconnectdb(conninfo);

    /* 检查看后端连接是否成功建立 */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        PQfinish(conn);
    }
	  /* 关闭到数据库的连接并且清理 */
PQfinish(conn); 

return 0;
}

非阻塞链接数据库

以非阻塞的方式建立一个到数据库服务器的连接:

PQconnectStartParams、PQconnectStart、PQconnectPoll三个函数被用来开启一个到数据库服务器的连接,这样你的应用的执行线程不会因为远程的I/O而被阻塞。这种方法的要点在于等待 I/O 完成可能在应用的主循环中发生,而不是在PQconnectdbParams或PQconnectdb中,因此应用能够把这种操作和其他动作并行处理。

#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

int
main(int argc, char **argv)
{
    const char *conninfo, feedback;
    PGconn     *conn;
	  int         sock;
	
	  conninfo = "postgresql://vbadmin:1234Abcde@localhost:5432/vastbase"
	
	  /* 建立到数据库的一个连接 */
    conn = PQconnectStart(conninfo);

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

		case CONNECTION_MADE:
			feedback = "Connected to server...";
			break;
		default:
			feedback = "Connecting...";
	}
	fprintf(stderr, "Connection to database failed: %s\n", feedback);
	
	sock = PQsocket(conn);
    if (sock < 0)
	{
		/* 不应该发生 */
		PQfinish(conn);
		return 0;
	}
	  /* 关闭到数据库的连接并且清理 */
PQfinish(conn); 

return 0;
}

连接字符串

几个libpq函数会解析一个用户指定的字符串来获得连接参数。这些字符串有两种被接受的格式:纯关键词 = 值字符串以及URI。URI通常遵循RFC 3986,除非像下文进一步描述的那样允许多主机连接字符串。

URL格式

一个连接URI的一般形式是:

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

URI模式标志符可以是postgresql://postgres://。每一个URI部分都是可选的。如:

postgresql://vbadmin:1234Abcde@localhost:5432/vastbase?host=/tmp&hostaddr=127.0.0.1

参数关键字

主要的参数关键词如下:

  • host: 要连接的主机名,如果一个主机名以斜线开始,则表示一个 Unix 域通信而不是 TCP/IP 通信,其值是存储套接字文件的目录名。当host没有指定或者为空时的默认行为是连接到一个/tmp中的 Unix 域套接字。在没有 Unix 域套接字的机器上,默认是连接到localhost。
  • hostaddr: 要连接的主机的数字 IP 地址。它应该是标准的 IPv4 地址格式,例如172.28.40.9。如果你的机器支持 IPv6,也可以使用IPv6地址。
  • port: 服务端监听的端口,默认为5432.
  • dbname: 数据库名。
  • user: 连接用户。
  • password: 服务器要求口令认证时要使用的口令。
  • passfile: 指定用于存放口令的文件名。默认是~/.pgpass,或者是Microsoft Windows上的%APPDATA%\postgresql\pgpass.conf(如果该文件不存在也不会报错)。
  • connect_timeout: 连接的最大等待时间,以秒为单位(写作一个十进制整数,例如10)。零、负值或者不指定表示无限等待。允许的最小超时是2秒,因此值1会被解释为2。这个超时单独应用于每个主机名或者IP地址。例如,如果指定两个主机并且connect_timeout为5,每个主机都会在5秒内没有建立起连接的情况下超时,因此花费在等待连接上的总时间可能高达10秒。
  • client_encoding: 为连接设置client_encoding配置参数。除了被相应服务器选项所接受的值,你还能使用auto从客户端的当前区域(Unix 系统上的LC_CTYPE环境变量)决定正确的编码。
  • options: 指定在连接开始时发送给服务器的命令行选项。例如,设置这个参数为-c geqo=off会把会话的geqo参数值设置为off。这个字符串中的空格被认为是命令行参数的分隔符,除非用一个反斜线\对它转义,用\\可以表示一个字面意义上的反斜线。
  • application_name: 为application_name配置参数指定一个值。

关闭到数据库的连接

调用PQfinish关闭与服务器的连接。同时释放PGconn对象使用的内存。

注意,即使与服务器的连接尝试失败(由PQstatus指示),应用也应当调用PQfinish来释放PGconn对象使用的内存。不能在调用PQfinish之后再使用PGconn指针。

PQfinish(conn);
connection.close();