|
说明:这是来自(Sams) PostgreSQL,The comprehensive guide to building, programming, and administering PostgreSQL databases, Second Edition一书中第5章第二、三节的内容,从整体框架上解释了客户端是如何与服务器端建立连接的。
译文:
当你想要建立应用程序来连接一个PostgreSQL数据库时,你会用到一个或者多个客户端应用程序接口(APIs)。PostgreSQL有多种多样的API来支持不同的编程语言。libpg--C/C plus plus; libpgeasy--C/C plus plus;ODBC--C/C plus plus;JDBC--Java;Perl--Perl;pgtcl--TCL等等。
客户端应用程序如何与一个PostgreSQL数据库通信呢?所有的客户端API都有一个通用的结构,但是由于客户端语言的不同,细节会有很大差别。下图是一个基本的流程图:
因为PostgreSQL是一个C/S结构的数据库,一些特定种类的连接必须存在与客户端应用程序和数据库服务器之间。在PostgreSQL中,客户端和服务器端以网络连接的方式来进行交流,如果客户端和服务器端是在不同的系统中,网络连接就是通过TCP/IP套接字的形式。如果客户端和服务器段是在同样的系统中,网络连接则还可能是Unix的域连接。
不考虑客户端是连接到本地的服务器还是连接到远程服务器,API都运用一组连接属性来建立连接。连接属性是用于确定服务器(一个网络端口号和主机地址),指定你想要连接的特定数据库,你的用户ID,密码和各种调试,登录选项。每一个API都允许你来设置连接属性,但你也可以在一些属性使用默认值。大部分客户端API让你以键值对的形式来设置连接属性。例如,去连接一个主机名为jersey的accounting数据库,你可以使用如下属性字符串:
“dbname=accounting host=jersey”
每一个键值对定义了一个简单的连接属性。如果你去除了一个连接属性,PostgreSQL会到环境变量中去查找对应的属性值,如果该环境变量不存在,PostgreSQL就使用硬编码值:
Keyword Enviroment Variable Description
dbname PGDATABASE 说明你想要连接的数据库名字,如果不指定,客户端会尝试连接与你当前用户名相 同的主机名。
user PGUSER 说明你想要连接数据库的用户名,如果不指定,客户端使用你当前操作系统的身份。
host PGHOST 说明你想要连接数据库的计算机的名字或IP地址。如果值是以"/"开头,客户端就认 为你想要以Unix域连接的方式连接你想要连接的目录,如果不特别指定,客户端就会 连接到Unix域下的/tmp地址。
hostaddr PGHOSTADDR 说明你想要连接数据库所在计算机的IP地址。如果你指定了hostaddr,你就可以避 免以host的名字来寻找服务器地址,如果不指定,客户端就使用host值来寻找服务器。
port PGPORT 说明你想要连接的TCP/IP端口号。如果不指定,PGPORT的默认值就是5432.
connect_timeout PGCONNECT_TIMEOUT 设置最大等待时间(等待连接请求的完成时间),如果不指定,客户端就会一直等待。
sslmode PGSSLMODE 说明客户端是否尝试一个SSL安全连接,可能的连接是disable, allow, prefer和 require. disable和require的意思是很明显的,但是allow和prefer看上去有些神秘。 如果sslmode的值是allow,客户端先尝试不安全连接,如果不能建立,也允许SSL连 接。如果sslmode的值是prefer,客户端先尝试安全连接,在不成功的情况下再尝试不 安全连接。如果不指定值,默认值为prefer.
service PGSERVICE 说明在pg_service.conf文件中定义的服务名。
一个很方便的方法来设置连接参数是使用pg_service.conf文件。当你指定了一个服务名字,客户端会打开一个名为$PREFIX/etc/pg_service.conf的文件,然后查找符合你提供的service-name。如果lippg确定了你提供的名字,他就会去读取对应服务名字的连接属性。一个典型的pg_service.conf文件像这样:
[accounting]
dbname=accounting
host=jersey
sslmode=required
[development]
dbname=accounting
host=guernseysslmode=prefer 每一个服务名都包含在中括号之中,且分别对应接下来的连接属性。以上定义了两种简单的连接的服务名(accounting和development)。
PS:在阅读上述代码后,应尝试使用编程的形式来连接PostgreSQL服务器。 |
|