Npgsql .net 版本的PostgreSQL数据库连接字符串及参数

6,329 阅读6分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」。

Npgsql 是.net 版本的postgreSQL的连接类库,当我们使用.net 进行PostgreSQL的相关开发时,首先接触的就是Npgsql,如果有兴趣的,可以去看看其源代码是怎么写的。

  • 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!
  • 📢本文作者:由webmote 原创,首发于 【CSDN】
  • 📢作者格言: 生活在于折腾,当你不折腾生活时,生活就开始折腾你,让我们一起加油!💪💪💪

1 连接字符串

PostgreSQL的精简版本连接字符串如下:

"Host=xxxx;Port=5432;Database=postgres;Username=postgres;Password=xxxxx;"

连接字符串的格式是 keyword1=value;keyword2=value;, Key不区分大小写,每组keyvalue,均使用英文分号分割开。

注意:Npgsql实现的链接库仅支持下列章节列出的关键字。

2 基本参数说明

范围描述默认
Host指定运行 PostgreSQL 的主机名。可以指定多个主机,(逗号分隔多主机). 如果该值以斜杠开头,则将其用作 Unix 域套接字的目录必需的
PortPostgreSQL 服务的 TCP 端口。默认: 5432
Database要连接的 PostgreSQL 数据库。默认:与用户名相同
Username要连接的用户名。如果使用 IntegratedSecurity,则不需要。PGUSER
Password要连接的密码。如果使用 IntegratedSecurity,则不需要。PGPASSWORD
PassfilePostgreSQL 密码文件 (PGPASSFILE) 的路径,从中获取密码。PGPASS文件

3. 安全和加密参数

参数描述默认
SSL Mode控制 SSL 是否开启,6.0+推荐
Trust Server Certificate是否信任服务证书而不用验证它. false
Client Certificate客户端证书路径PGSSLCERT
Client Certificate Key证书的KeyPGSSLKEY
Root Certificate验证服务器证书的根证书路径PGSSLROOTCERT
Check Certificate Revocation授权后是否检查证书是否撤销6.0+ 为true
Integrated Security是否混合验证 (GSS/SSPI). false
Persist Security Info是否设置连接密码为敏感信息,如果是,则获取连接字符串时不返回密码false
Kerberos Service NameKerberos 服务器名称postgres
Include Realm授权使用的Kerberos realm
Include Error Detail当激活时,PostgreSQL错误和通知详情包含在 PostgresException.Detail 和 PostgresNotice.Detail内.false
Log Parameters如果激活, 命令中的参数值被记录到日志false

4.链接池参数

重要章节

参数描述默认
Pooling是否激活链接池.true ,默认激活
Minimum Pool Size最小链接池数目.0
Maximum Pool Size最大链接池数目.3.1+版本是100 ,以前版本是 20
Connection Idle Lifetime单位:秒。如果链接数超过了最小链接数字限定,那么在关闭池子中的空闲链接时等待的时间300
Connection Pruning Interval链接修剪间隔(多长时间去处理池子中的空闲链接们)10
ConnectionLifetime链接的生命周期有多长,在从池子中返回链接时判断,如果超过了则关闭销毁该链接. 这在故障转移和负载均衡上非常有效0 (disabled)

5 超时和心跳保持参数

极重要章节:

参数描述默认
Timeout单位秒,链接的建立链接的超时时间15
Command Timeout单位秒,链接的命令执行超时时间,如果设置为0,则表示不超时30
Internal Command Timeout执行一个内部命令时的超时时间. -1 用 CommandTimeout, 0 不超时.-1
Cancellation Timeout取消一个查询时的超时时间 ,-1 跳过等待, 0 无限等待.2000
Keepalive心跳时间,保活链接.0 (disabled)
Tcp Keepalive是否用系统默认的tcp keepalive 作为心跳参数false
Tcp Keepalive Time单位毫秒,tcp保活时间. 仅支持 Windows.0 (disabled)
Tcp Keepalive Interval单位毫秒,没有ACK收到时,连续心跳包的间隔时间 仅支持Windows. Tcp Keepalive Time

6 性能参数

参数描述默认值
Max Auto Prepare在任何给定点可以自动准备的最大 SQL 语句数。超过这个数字,最近最少使用的语句将被回收。0禁用自动准备。0
Auto Prepare Min UsagesSQL 语句在自动准备之前使用的最少使用次数。5
Use Perf Counters使 Npgsql 将有关连接使用的性能信息写入 Windows 性能计数器。 在 5.0 + 版本后删除。false
Read Buffer Size确定 Npgsql 在读取时使用的内部缓冲区的大小。如果从数据库传输大字节流值,增加会提高性能。8192
Write Buffer Size确定 Npgsql 在写入时使用的内部缓冲区的大小。如果将大字节流值传输到数据库,增加会提高性能。8192
Socket Receive Buffer Size确定套接字接收缓冲区的大小。System-dependent
Socket Send Buffer Size确定套接字发送缓冲区的大小。System-dependent
No Reset On Close在某些情况下,通过在返回池时不重置连接状态来提高性能,但以泄漏状态为代价。仅在基准测试显示性能改进时使用false

7 故障转移和负载平衡参数

参数描述默认
Target Session Attributes确定首选的 PostgreSQL 目标服务器类型。PGTARGETSESSIONATTRS, Any
Load Balance Hosts通过负载在多个主机之间实现平衡。false
Host Recheck Seconds控制主机的缓存状态将被视为有效的时间。10

8 一些小甜点的参数

参数描述默认
Options指定任何有效 PostgreSQL 连接选项, 被单个刻度包围。在 5.0 中引入。PGOPTIONS
Application Name要在连接启动期间发送到后端的可选应用程序名称参数。
Enlist是否在环境 TransactionScope 中登记。true
Search Path设置Schema搜索路径。
Client Encoding获取或设置 client_encoding 参数。PGCLIENTENCODING
Encoding获取或设置将用于编码/解码 PostgreSQL 字符串数据的 .NET 编码。UTF8
Timezone获取或设置会话时区。PGTZ
EF Template Database在实体框架中创建数据库时指定的数据库模板。template1
EF Admin Database在实体框架中创建和删除数据库时要指定的数据库管理员。template1
Load Table Composites加载表复合类型定义,而不仅仅是独立的复合类型。错误的
Array Nullability Mode配置作为对象实例请求时返回值类型数组的方式。可能的值为:Never(值类型的数组总是作为不可空数组返回)、Always(值类型的数组总是作为可空数组返回)和 PerInstance(返回的数组类型在运行时确定)。Never

9 兼容模式

参数描述默认
Server Compatibility Mode特殊 PostgreSQL 服务器类型的兼容模式。目前支持“Redshift”,以及“NoTypeLoading”,它将绕过来自 PostgreSQL 目录表的正常类型加载机制并支持基本类型的硬编码列表。none

10 环境变量

除了链接字符串参数外,Npgsql还能识别环境变量。

环境变量描述
PGUSER行为同 链接参数 User
PGPASSWORD行为同 链接参password
PGPASSFILE行为同 链接参数passfile
PGSSLCERT行为同 链接参数 sslcert
PGSSLKEY行为同 链接参数 sslkey
PGSSLROOTCERT行为同 链接参数 sslrootcert
PGCLIENTENCODING行为同 链接参数 client_encoding
PGTZ行为同 链接参数 default time zone.
PGOPTIONS行为同 链接参数 options

11. 小结

介绍这些参数很枯燥,有啥意义呢,不就时链接个数据库吗,搞这么复杂?

哎,谁遇到问题谁知道,这些参数个个救命,改天我再和你聊聊怎么解救了我的。

👓都看到这了,还在乎点个赞吗?

👓都点赞了,还在乎一个收藏吗?

👓都收藏了,还在乎一个评论吗?