PostgreSQL的客戶端接口
在PostgreSQL發行版中只包含兩個客戶端接口: libpq 和 ECPG
- libpq is included because it is the primary C language interface, and because many other client interfaces are built on top of it.
- ECPG is included because it depends on the server-side SQL grammar, and is therefore sensitive to changes in PostgreSQL itself.
其他語言客戶端接口:
| Name | Language | Comments | Website |
|---|---|---|---|
| DBD::Pg | Perl | Perl DBI driver | https://metacpan.org/release/DBD-Pg |
| JDBC | Java | Type 4 JDBC driver | https://jdbc.postgresql.org/ |
| libpqxx | C++ | C++ interface | https://pqxx.org/ |
| node-postgres | JavaScript | Node.js driver | https://node-postgres.com/ |
| Npgsql | .NET | .NET data provider | https://www.npgsql.org/ |
| pgtcl | Tcl | - | https://github.com/flightaware/Pgtcl |
| pgtclng | Tcl | - | https://sourceforge.net/projects/pgtclng/ |
| pq | Go | Pure Go driver for Go’s database/sql | https://github.com/lib/pq |
| psqlODBC | ODBC | ODBC driver | https://odbc.postgresql.org/ |
| psycopg | Python | DB API 2.0-compliant | https://www.psycopg.org/ |
簡單介紹
Node.js
??簡單的說 Node.js 就是運行在服務端的 JavaScript。
??Node.js 是一個 JavaScript 運行環境(runtime),它讓 JavaScript 可以開發后端程序,它幾乎能實現其他后端語言能實現的所有功能。
??Node.js 基于 Google V8 引擎,V8 引擎是 Google 發布的一款開源的 JavaScript 引擎,原來主要用于 Chrome 瀏覽器的 JS 解釋部分,后來讓 Ryan Dahi 把這個 V8 引擎搬到了服務器上,用做服務器的軟件。
??Node.js 最擅長的就是處理高并發,在Java、PHP或者.net等服務器端語言中,會為每一個客戶端連接創建一個新的線程。而每個線程需要耗費大約2MB內存。也就是說,理論上,一個8GB內存的服務器可以同時連接的最大用戶數為4000個左右。要讓Web應用程序支持更多的用戶,就需要增加服務器的數量,而Web應用程序的硬件成本當然就上升了。Node.js不為每個客戶連接創建一個新的線程,而僅僅使用一個線程。當有用戶連接了,就觸發一個內部事件,通過非阻塞I/O、事件驅動機制,讓Node.js程序宏觀上也是并行的。使用Node.js,一個8GB內存的服務器,可以同時處理超過4萬用戶的連接。
??Node.js的官方網站:中文 https://nodejs.org/zh-cn/ 英文 https://nodejs.org/en/
??之前研究PostgreSQL高可用裝 etcd-browser WEB可視化界面時用過 nodejs,使用 nodejs 啟動 etcd-browser。
??PostgreSQL高可用測試系列之Patroni + etcd + HAProxy + Keepalived 離線部署(三) 7. etcd-browser WEB可視化界面
Node.js 連接各個數據庫使用的包
| 數據庫 | 包名 | 安裝命令 | github地址 |
|---|---|---|---|
| PostgreSQL | node-postgres | npm install pg | https://github.com/brianc/node-postgres |
| Oracle | node-oracledb | npm install oracledb | https://github.com/oracle/node-oracledb |
| Mysql | node-mysql2 | npm install --save mysql2 | https://github.com/sidorares/node-mysql2 |
| SQL Server | node-mssql | npm install mssql | https://github.com/tediousjs/node-mssql |
| MongoDB | node-mongodb-native | npm install mongodb | https://github.com/mongodb/node-mongodb-native |
| IBM DB2 | node-ibm_db | npm install ibm_db | https://github.com/ibmdb/node-ibm_db |
| openGauss | node-opengauss | npm install node-opengauss --save | https://github.com/lolimay/node-opengauss |
| 達夢8 | dmdb | npm install dmdb | - |
node-postgres
??node-postgres 是一組 node.js 模塊,用于與 PostgreSQL 數據庫交互。
??node-postgres的官方網站: https://node-postgres.com/
環境準備
- 下載安裝 nodejs
nodejs下載地址:https://nodejs.org/zh-cn/download/ 文件:node-v16.13.0-linux-x64.tar.xz
# 安裝nodejs,已經編譯好的包,解壓即是安裝
[root@pgtest3 ~]# tar -xvf /enmo/soft/node-v16.13.0-linux-x64.tar.xz -C /enmo/app
[root@pgtest3 ~]# mv /enmo/app/node-v16.13.0-linux-x64 /enmo/app/node-16.13.0
[root@pgtest3 ~]# ln -s /enmo/app/node-16.13.0 /enmo/app/nodejs
[root@pgtest3 ~]# sed -i "s;:\$PATH:;:/enmo/app/nodejs/bin:\$PATH:;g" /etc/profile
[root@pgtest3 ~]# source /etc/profile
[root@pgtest3 ~]# node -v
v16.13.0
- 下載安裝 node-postgres
node-postgres下載地址:https://github.com/brianc/node-postgres 文件:node-postgres-master.zip
安裝 node-postgres 需要使用 npm 命令或者 cnpm 命令。npm 是隨同 Node.js 一起安裝的包(模塊的集合)管理工具,可以使用 npm 安裝第三方模塊包,第三方模塊包可以在https://www.npmjs.com/找到。cnpm 是 npm 的國內替代命令,如果 npm 下載包比較慢或安裝出現各種問題,可以選擇使用 cnpm。
??如果服務器可以連接互聯網,直接使用 npm 命令安裝 node-postgres
# 先創建一個項目目錄,將模塊安裝到這個項目目錄下
[root@yum ~]# mkdir -p /enmo/app/test_nodejs
# 進入項目目錄在執行 npm 安裝
[root@yum ~]# cd /enmo/app/test_nodejs
# 在開發項目中,建議安裝時加上--save,會把安裝的包信息寫入到package.json文件的dependencies里,可以方便找到依賴包
# 但是新版的npm不加-save也可以自動寫進去,但是如果使用 cnpm 就不一定會寫入了
# npm可以指定安裝版本 npm install pg@8.4.0 --save
[root@yum ~]# npm install pg --save
[root@yum test_nodejs]# npm list
test_nodejs@ /enmo/app/test_nodejs
└── pg@8.7.1
[root@yum test_nodejs]# ll
drwxr-xr-x 22 root root 4096 Nov 8 00:33 node_modules
-rw-r--r-- 1 root root 47 Nov 8 00:33 package.json
-rw-r--r-- 1 root root 13170 Nov 8 00:33 package-lock.json
# 查看包的信息
[root@yum test_nodejs]# npm info pg
pg@8.7.1 | MIT | deps: 7 | versions: 211
PostgreSQL client - pure javascript & libpq with the same API
https://github.com/brianc/node-postgres
keywords: database, libpq, pg, postgre, postgres, postgresql, rdbms
dist
.tarball: https://registry.npmjs.org/pg/-/pg-8.7.1.tgz
.shasum: 9ea9d1ec225980c36f94e181d009ab9f4ce4c471
.integrity: sha512-7bdYcv7V6U3KAtWjpQJJBww0UEsWuh4yQ/EjNf2HeO/NnvKjpvhEIe/A/TleP6wtmSKnUnghs5A9jUoK6iDdkA==
.unpackedSize: 71.5 kB
dependencies:
buffer-writer: 2.0.0 packet-reader: 1.0.0 pg-connection-string: ^2.5.0 pg-pool: ^3.4.1 pg-protocol: ^1.5.0 pg-types: ^2.1.0 pgpass: 1.x
... ...
??如果服務器可以連接互聯網,也可以使用 cnpm 命令安裝 node-postgres
# 首先安裝 cnpm
[root@yum ~]# npm install -g cnpm --registry=https://registry.npmmirror.com
[root@yum ~]# mkdir -p /enmo/app/test_cnpm
[root@yum ~]# cd /enmo/app/test_cnpm
[root@yum test_cnpm]# cnpm install pg --save
[root@yum test_cnpm]# cat package.json
{
"dependencies": {
"pg": "^8.7.1"
}
}
[root@yum test_cnpm]# cnpm list
/enmo/app/test_cnpm
├── buffer-writer@2.0.0 extraneous
├── inherits@2.0.4 extraneous
├── packet-reader@1.0.0 extraneous
├── pg-connection-string@2.5.0 extraneous
├── pg-int8@1.0.1 extraneous
├── pg-pool@3.4.1 extraneous
├── pg-protocol@1.5.0 extraneous
├── pg-types@2.2.0 extraneous
├── pg@8.7.1 extraneous
├── pgpass@1.0.4 extraneous
├── postgres-array@2.0.0 extraneous
... ...
??如果服務器不能連接互聯網,就得從其他服務器上將安裝好的node_modules復制過來,有的說下載源碼可以離線安裝,半天沒整明白,我從能聯網的服務器復制過來也好使,網盤分享中是我打的包,有需要的可以試試,不一定好使:鏈接:https://pan.baidu.com/s/1xuLs6quX3Hhwcdu7xX6rZA 提取碼:pphi
# 首先在可以聯網的服務器上安裝 node-postgres
# 在可以聯網的服務器上打包項目目錄
[root@yum ~]# cp /enmo/app/test_nodejs /enmo/app/node-postgres-8.7.1
[root@yum ~]# cd /enmo/app
[root@yum app]# tar -zcvf node-postgres-8.7.1.tar.gz node-postgres-8.7.1
# 將 node-postgres-8.7.1.tar.gz 傳到不能聯網的服務器上解壓
[root@pgtest3 ~]# tar -zxvf /enmo/soft/node-postgres-8.7.1.tar.gz -C /enmo/app/
# mv成項目名
[root@pgtest3 ~]# mv /enmo/app/node-postgres-8.7.1 /enmo/app/nodejs_conn_pg
# cd nodejs_conn_pg 創建項目腳本
[root@pgtest3 ~]# cd /enmo/app/nodejs_conn_pg
[root@pgtest3 nodejs_conn_pg]# vi conn_pg.js
const pg = require('pg')
const ClientClass = pg.Client
const pgUrl = 'postgres://postgres:postgres@192.168.58.10:5432/postgres'
const client = new ClientClass(pgUrl)
async function connect(client) {
try {
await client.connect()
console.log(`Client connected.`)
const {rows} = await client.query('select inet_server_addr(),pg_is_in_recovery(),current_database(),current_user')
console.table(rows)
await client.end()
}
catch(ex){
console.log("Some error" + ex)
}
finally {
await client.end()
}
}
connect(client)
# node 執行
[root@pgtest3 nodejs_conn_pg]# node conn_pg.js
Client connected.
┌─────────┬──────────────────┬───────────────────┬──────────────────┬──────────────┐
│ (index) │ inet_server_addr │ pg_is_in_recovery │ current_database │ current_user │
├─────────┼──────────────────┼───────────────────┼──────────────────┼──────────────┤
│ 0 │ '192.168.58.10' │ false │ 'postgres' │ 'postgres' │
└─────────┴──────────────────┴───────────────────┴──────────────────┴──────────────┘
使用pool的測試
const { Pool } = require('pg')
const connectionString = 'postgres://postgres:postgres@192.168.58.10:5432/postgres'
const pool = new Pool({
connectionString,
max: 10,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
})
pool.on('error', (err, client) => {
console.error('Unexpected error on idle client', err)
process.exit(-1)
})
;(async function() {
const client = await pool.connect()
const { rows } = await client.query('select inet_server_addr(),pg_is_in_recovery(),current_database(),current_user')
console.table(rows)
client.release()
})()
pool.end(() => {
console.log('pool has ended')
})

測試超出連接池最大限制





