真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

postgresql池的簡單介紹

C3P0連接池配置錯(cuò)誤引發(fā)異常

初次使用C3P0會(huì)如果配置錯(cuò)誤,會(huì)引發(fā)以下異常,乍一看以為是會(huì)連接池超時(shí)問題。

10年積累的網(wǎng)站制作、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有宏偉免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

其實(shí)是配置錯(cuò)誤,連接池根本沒有 Connection 對象,所以根本拿不到連接對象。

我的之前的配置文件如下所示, property name="jdbcUrl"jdbc:postgresql//localhost:5432/shop/property 兩個(gè)postgresql和//之間漏打了:,倒是參數(shù)配置異常報(bào)錯(cuò),所以初學(xué)者最好仔細(xì)檢查配置參數(shù)是否正確。

nodejs與postgresql連接池有什么作用

PostgreSql是一個(gè)面向?qū)ο蟮年P(guān)系數(shù)據(jù)庫,postgis是一個(gè)基于PostgreSql的空間數(shù)據(jù)庫插件,主要用于管理地理空間數(shù)據(jù)。因此在GIS領(lǐng)域,廣泛使用PostgreSql作為空間數(shù)據(jù)庫。

MySQL與PostgreSQL比較 哪個(gè)數(shù)據(jù)庫更好

特性 MySQL PostgreSQL

實(shí)例 通過執(zhí)行 MySQL 命令(mysqld)啟動(dòng)實(shí)例。一個(gè)實(shí)例可以管理一個(gè)或多個(gè)數(shù)據(jù)庫。一臺(tái)服務(wù)器可以運(yùn)行多個(gè) mysqld 實(shí)例。一個(gè)實(shí)例管理器可以監(jiān)視 mysqld 的各個(gè)實(shí)例。

通過執(zhí)行 Postmaster 進(jìn)程(pg_ctl)啟動(dòng)實(shí)例。一個(gè)實(shí)例可以管理一個(gè)或多個(gè)數(shù)據(jù)庫,這些數(shù)據(jù)庫組成一個(gè)集群。集群是磁盤上的一個(gè)區(qū)域,這個(gè)區(qū)域在安裝時(shí)初始化并由一個(gè)目錄組成,所有數(shù)據(jù)都存儲(chǔ)在這個(gè)目錄中。使用 initdb 創(chuàng)建第一個(gè)數(shù)據(jù)庫。一臺(tái)機(jī)器上可以啟動(dòng)多個(gè)實(shí)例。

數(shù)據(jù)庫 數(shù)據(jù)庫是命名的對象集合,是與實(shí)例中的其他數(shù)據(jù)庫分離的實(shí)體。一個(gè) MySQL 實(shí)例中的所有數(shù)據(jù)庫共享同一個(gè)系統(tǒng)編目。 數(shù)據(jù)庫是命名的對象集合,每個(gè)數(shù)據(jù)庫是與其他數(shù)據(jù)庫分離的實(shí)體。每個(gè)數(shù)據(jù)庫有自己的系統(tǒng)編目,但是所有數(shù)據(jù)庫共享 pg_databases。

數(shù)據(jù)緩沖區(qū) 通過 innodb_buffer_pool_size 配置參數(shù)設(shè)置數(shù)據(jù)緩沖區(qū)。這個(gè)參數(shù)是內(nèi)存緩沖區(qū)的字節(jié)數(shù),InnoDB 使用這個(gè)緩沖區(qū)來緩存表的數(shù)據(jù)和索引。在專用的數(shù)據(jù)庫服務(wù)器上,這個(gè)參數(shù)最高可以設(shè)置為機(jī)器物理內(nèi)存量的 80%。 Shared_buffers 緩存。在默認(rèn)情況下分配 64 個(gè)緩沖區(qū)。默認(rèn)的塊大小是 8K??梢酝ㄟ^設(shè)置 postgresql.conf 文件中的 shared_buffers 參數(shù)來更新緩沖區(qū)緩存。

數(shù)據(jù)庫連接 客戶機(jī)使用 CONNECT 或 USE 語句連接數(shù)據(jù)庫,這時(shí)要指定數(shù)據(jù)庫名,還可以指定用戶 id 和密碼。使用角色管理數(shù)據(jù)庫中的用戶和用戶組。 客戶機(jī)使用 connect 語句連接數(shù)據(jù)庫,這時(shí)要指定數(shù)據(jù)庫名,還可以指定用戶 id 和密碼。使用角色管理數(shù)據(jù)庫中的用戶和用戶組。

身份驗(yàn)證 MySQL 在數(shù)據(jù)庫級(jí)管理身份驗(yàn)證。 基本只支持密碼認(rèn)證。 PostgreSQL 支持豐富的認(rèn)證方法:信任認(rèn)證、口令認(rèn)證、Kerberos 認(rèn)證、基于 Ident 的認(rèn)證、LDAP 認(rèn)證、PAM 認(rèn)證

加密 可以在表級(jí)指定密碼來對數(shù)據(jù)進(jìn)行加密。還可以使用 AES_ENCRYPT 和 AES_DECRYPT 函數(shù)對列數(shù)據(jù)進(jìn)行加密和解密。可以通過 SSL 連接實(shí)現(xiàn)網(wǎng)絡(luò)加密。 可以使用 pgcrypto 庫中的函數(shù)對列進(jìn)行加密/解密??梢酝ㄟ^ SSL 連接實(shí)現(xiàn)網(wǎng)絡(luò)加密。

審計(jì) 可以對 querylog 執(zhí)行 grep。 可以在表上使用 PL/pgSQL 觸發(fā)器來進(jìn)行審計(jì)。

查詢解釋 使用 EXPLAIN 命令查看查詢的解釋計(jì)劃。 使用 EXPLAIN 命令查看查詢的解釋計(jì)劃。

備份、恢復(fù)和日志 InnoDB 使用寫前(write-ahead)日志記錄。支持在線和離線完全備份以及崩潰和事務(wù)恢復(fù)。需要第三方軟件才能支持熱備份。 在數(shù)據(jù)目錄的一個(gè)子目錄中維護(hù)寫前日志。支持在線和離線完全備份以及崩潰、時(shí)間點(diǎn)和事務(wù)恢復(fù)。 可以支持熱備份。

JDBC 驅(qū)動(dòng)程序 可以從 參考資料 下載 JDBC 驅(qū)動(dòng)程序。 可以從 參考資料 下載 JDBC 驅(qū)動(dòng)程序。

表類型 取決于存儲(chǔ)引擎。例如,NDB 存儲(chǔ)引擎支持分區(qū)表,內(nèi)存引擎支持內(nèi)存表。 支持臨時(shí)表、常規(guī)表以及范圍和列表類型的分區(qū)表。不支持哈希分區(qū)表。 由于PostgreSQL的表分區(qū)是通過表繼承和規(guī)則系統(tǒng)完成了,所以可以實(shí)現(xiàn)更復(fù)雜的分區(qū)方式。

索引類型 取決于存儲(chǔ)引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-樹、哈希、R-樹和 Gist 索引。

約束 支持主鍵、外鍵、惟一和非空約束。對檢查約束進(jìn)行解析,但是不強(qiáng)制實(shí)施。 支持主鍵、外鍵、惟一、非空和檢查約束。

存儲(chǔ)過程和用戶定義函數(shù) 支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲(chǔ)過程可以用 SQL 和 C++ 編寫。用戶定義函數(shù)可以用 SQL、C 和 C++ 編寫。 沒有單獨(dú)的存儲(chǔ)過程,都是通過函數(shù)實(shí)現(xiàn)的。用戶定義函數(shù)可以用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。

觸發(fā)器 支持行前觸發(fā)器、行后觸發(fā)器和語句觸發(fā)器,觸發(fā)器語句用過程語言復(fù)合語句編寫。 支持行前觸發(fā)器、行后觸發(fā)器和語句觸發(fā)器,觸發(fā)器過程用 C 編寫。

系統(tǒng)配置文件 my.conf Postgresql.conf

數(shù)據(jù)庫配置 my.conf Postgresql.conf

客戶機(jī)連接文件 my.conf pg_hba.conf

XML 支持 有限的 XML 支持。 有限的 XML 支持。

數(shù)據(jù)訪問和管理服務(wù)器 OPTIMIZE TABLE —— 回收未使用的空間并消除數(shù)據(jù)文件的碎片

myisamchk -analyze —— 更新查詢優(yōu)化器所使用的統(tǒng)計(jì)數(shù)據(jù)(MyISAM 存儲(chǔ)引擎)

mysql —— 命令行工具

MySQL Administrator —— 客戶機(jī) GUI 工具 Vacuum —— 回收未使用的空間

Analyze —— 更新查詢優(yōu)化器所使用的統(tǒng)計(jì)數(shù)據(jù)

psql —— 命令行工具

pgAdmin —— 客戶機(jī) GUI 工具

并發(fā)控制 支持表級(jí)和行級(jí)鎖。InnoDB 存儲(chǔ)引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 語句在事務(wù)級(jí)設(shè)置隔離級(jí)別。 支持表級(jí)和行級(jí)鎖。支持的 ANSI 隔離級(jí)別是 Read Committed(默認(rèn) —— 能看到查詢啟動(dòng)時(shí)數(shù)據(jù)庫的快照)和 Serialization(與 Repeatable Read 相似 —— 只能看到在事務(wù)啟動(dòng)之前提交的結(jié)果)。使用 SET TRANSACTION 語句在事務(wù)級(jí)設(shè)置隔離級(jí)別。使用 SET SESSION 在會(huì)話級(jí)進(jìn)行設(shè)置。

MySQL相對于PostgreSQL的劣勢:

MySQL

PostgreSQL

最重要的引擎InnoDB很早就由Oracle公司控制。目前整個(gè)MySQL數(shù)據(jù)庫都由Oracle控制。

BSD協(xié)議,沒有被大公司壟斷。

對復(fù)雜查詢的處理較弱,查詢優(yōu)化器不夠成熟

很強(qiáng)大的查詢優(yōu)化器,支持很復(fù)雜的查詢處理。

只有一種表連接類型:嵌套循環(huán)連接(nested-loop),不支持排序-合并連接(sort-merge join)與散列連接(hash join)。

都支持

性能優(yōu)化工具與度量信息不足

提供了一些性能視圖,可以方便的看到發(fā)生在一個(gè)表和索引上的select、delete、update、insert統(tǒng)計(jì)信息,也可以看到cache命中率。網(wǎng)上有一個(gè)開源的pgstatspack工具。

InnoDB的表和索引都是按相同的方式存儲(chǔ)。也就是說表都是索引組織表。這一般要求主鍵不能太長而且插入時(shí)的主鍵最好是按順序遞增,否則對性能有很大影響。

不存在這個(gè)問題。

大部分查詢只能使用表上的單一索引;在某些情況下,會(huì)存在使用多個(gè)索引的查詢,但是查詢優(yōu)化器通常會(huì)低估其成本,它們常常比表掃描還要慢。

不存在這個(gè)問題

表增加列,基本上是重建表和索引,會(huì)花很長時(shí)間。

表增加列,只是在數(shù)據(jù)字典中增加表定義,不會(huì)重建表

存儲(chǔ)過程與觸發(fā)器的功能有限??捎脕砭帉懘鎯?chǔ)過程、觸發(fā)器、計(jì)劃事件以及存儲(chǔ)函數(shù)的語言功能較弱

除支持pl/pgsql寫存儲(chǔ)過程,還支持perl、python、Tcl類型的存儲(chǔ)過程:pl/perl,pl/python,pl/tcl。

也支持用C語言寫存儲(chǔ)過程。

不支持Sequence。

支持

不支持函數(shù)索引,只能在創(chuàng)建基于具體列的索引。

不支持物化視圖。

支持函數(shù)索引,同時(shí)還支持部分?jǐn)?shù)據(jù)索引,通過規(guī)則系統(tǒng)可以實(shí)現(xiàn)物化視圖的功能。

執(zhí)行計(jì)劃并不是全局共享的, 僅僅在連接內(nèi)部是共享的。

執(zhí)行計(jì)劃共享

MySQL支持的SQL語法(ANSI SQL標(biāo)準(zhǔn))的很小一部分。不支持遞歸查詢、通用表表達(dá)式(Oracle的with 語句)或者窗口函數(shù)(分析函數(shù))。

都 支持

不支持用戶自定義類型或域(domain)

支持。

對于時(shí)間、日期、間隔等時(shí)間類型沒有秒以下級(jí)別的存儲(chǔ)類型

可以精確到秒以下。

身份驗(yàn)證功能是完全內(nèi)置的,不支持操作系統(tǒng)認(rèn)證、PAM認(rèn)證,不支持LDAP以及其它類似的外部身份驗(yàn)證功能。

支持OS認(rèn)證、Kerberos 認(rèn)證 、Ident 的認(rèn)證、LDAP 認(rèn)證、PAM 認(rèn)證

不支持database link。有一種叫做Federated的存儲(chǔ)引擎可以作為一個(gè)中轉(zhuǎn)將查詢語句傳遞到遠(yuǎn)程服務(wù)器的一個(gè)表上,不過,它功能很粗糙并且漏洞很多

有dblink,同時(shí)還有一個(gè)dbi-link的東西,可以連接到oracle和mysql上。

Mysql Cluster可能與你的想象有較大差異。開源的cluster軟件較少。

復(fù)制(Replication)功能是異步的,并且有很大的局限性.例如,它是單線程的(single-threaded),因此一個(gè)處理能力更強(qiáng)的Slave的恢復(fù)速度也很難跟上處理能力相對較慢的Master.

有豐富的開源cluster軟件支持。

explain看執(zhí)行計(jì)劃的結(jié)果簡單。

explain返回豐富的信息。

類似于ALTER TABLE或CREATE TABLE一類的操作都是非事務(wù)性的.它們會(huì)提交未提交的事務(wù),并且不能回滾也不能做災(zāi)難恢復(fù)

DDL也是有事務(wù)的。

PostgreSQL主要優(yōu)勢:

1. PostgreSQL完全免費(fèi),而且是BSD協(xié)議,如果你把PostgreSQL改一改,然后再拿去賣錢,也沒有人管你,這一點(diǎn)很重要,這表明了PostgreSQL數(shù)據(jù)庫不會(huì)被其它公司控制。oracle數(shù)據(jù)庫不用說了,是商業(yè)數(shù)據(jù)庫,不開放。而MySQL數(shù)據(jù)庫雖然是開源的,但現(xiàn)在隨著SUN被oracle公司收購,現(xiàn)在基本上被oracle公司控制,其實(shí)在SUN被收購之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的數(shù)據(jù)都是放在InnoDB引擎中的,反正我們公司都是這樣的。所以如果MySQL的市場范圍與oracle數(shù)據(jù)庫的市場范圍沖突時(shí),oracle公司必定會(huì)犧牲MySQL,這是毫無疑問的。

2. 與PostgreSQl配合的開源軟件很多,有很多分布式集群軟件,如pgpool、pgcluster、slony、plploxy等等,很容易做讀寫分離、負(fù)載均衡、數(shù)據(jù)水平拆分等方案,而這在MySQL下則比較困難。

3. PostgreSQL源代碼寫的很清晰,易讀性比MySQL強(qiáng)太多了,懷疑MySQL的源代碼被混淆過。所以很多公司都是基本PostgreSQL做二次開發(fā)的。

4. PostgreSQL在很多方面都比MySQL強(qiáng),如復(fù)雜SQL的執(zhí)行、存儲(chǔ)過程、觸發(fā)器、索引。同時(shí)PostgreSQL是多進(jìn)程的,而MySQL是線程的,雖然并發(fā)不高時(shí),MySQL處理速度快,但當(dāng)并發(fā)高的時(shí)候,對于現(xiàn)在多核的單臺(tái)機(jī)器上,MySQL的總體處理性能不如PostgreSQL,原因是MySQL的線程無法充分利用CPU的能力。

目前只想到這些,以后想到再添加,歡迎大家拍磚。

PostgreSQL與oracle或InnoDB的多版本實(shí)現(xiàn)的差別

PostgreSQL與oracle或InnoDB的多版本實(shí)現(xiàn)最大的區(qū)別在于最新版本和歷史版本是否分離存儲(chǔ),PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分離了數(shù)據(jù),索引本身沒有分開。

PostgreSQL的主要優(yōu)勢在于:

1. PostgreSQL沒有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對于oracle與Innodb來說,回滾段是非常重要的,回滾段損壞,會(huì)導(dǎo)致數(shù)據(jù)丟失,甚至數(shù)據(jù)庫無法啟動(dòng)的嚴(yán)重問題。另由于PostgreSQL沒有回滾段,舊數(shù)據(jù)都是記錄在原先的文件中,所以當(dāng)數(shù)據(jù)庫異常crash后,恢復(fù)時(shí),不會(huì)象oracle與Innodb數(shù)據(jù)庫那樣進(jìn)行那么復(fù)雜的恢復(fù),因?yàn)閛racle與Innodb恢復(fù)時(shí)同步需要redo和undo。所以PostgreSQL數(shù)據(jù)庫在出現(xiàn)異常crash后,數(shù)據(jù)庫起不來的幾率要比oracle和mysql小一些。

2. 由于舊的數(shù)據(jù)是直接記錄在數(shù)據(jù)文件中,而不是回滾段中,所以不會(huì)象oracle那樣經(jīng)常報(bào)ora-01555錯(cuò)誤。

3. 回滾可以很快完成,因?yàn)榛貪L并不刪除數(shù)據(jù),而oracle與Innodb,回滾時(shí)很復(fù)雜,在事務(wù)回滾時(shí)必須清理該事務(wù)所進(jìn)行的修改,插入的記錄要?jiǎng)h除,更新的記錄要更新回來(見row_undo函數(shù)),同時(shí)回滾的過程也會(huì)再次產(chǎn)生大量的redo日志。

4. WAL日志要比oracle和Innodb簡單,對于oracle不僅需要記錄數(shù)據(jù)文件的變化,還要記錄回滾段的變化。

PostgreSQL的多版本的主要劣勢在于:

1、最新版本和歷史版本不分離存儲(chǔ),導(dǎo)致清理老舊版本需要作更多的掃描,代價(jià)比較大,但一般的數(shù)據(jù)庫都有高峰期,如果我們合理安排VACUUM,這也不是很大的問題,而且在PostgreSQL9.0中VACUUM進(jìn)一步被加強(qiáng)了。

2、由于索引中完全沒有版本信息,不能實(shí)現(xiàn)Coverage index scan,即查詢只掃描索引,直接從索引中返回所需的屬性,還需要訪問表。而oracle與Innodb則可以;

進(jìn)程模式與線程模式的對比

PostgreSQL和oracle是進(jìn)程模式,MySQL是線程模式。

進(jìn)程模式對多CPU利用率比較高。

進(jìn)程模式共享數(shù)據(jù)需要用到共享內(nèi)存,而線程模式數(shù)據(jù)本身就是在進(jìn)程空間內(nèi)都是共享的,不同線程訪問只需要控制好線程之間的同步。

線程模式對資源消耗比較少。

所以MySQL能支持遠(yuǎn)比oracle多的更多的連接。

對于PostgreSQL的來說,如果不使用連接池軟件,也存在這個(gè)問題,但PostgreSQL中有優(yōu)秀的連接池軟件軟件,如pgbouncer和pgpool,所以通過連接池也可以支持很多的連接。

堆表與索引組織表的的對比

Oracle支持堆表,也支持索引組織表

PostgreSQL只支持堆表,不支持索引組織表

Innodb只支持索引組織表

索引組織表的優(yōu)勢:

表內(nèi)的數(shù)據(jù)就是按索引的方式組織,數(shù)據(jù)是有序的,如果數(shù)據(jù)都是按主鍵來訪問,那么訪問數(shù)據(jù)比較快。而堆表,按主鍵訪問數(shù)據(jù)時(shí),是需要先按主鍵索引找到數(shù)據(jù)的物理位置。

索引組織表的劣勢:

索引組織表中上再加其它的索引時(shí),其它的索引記錄的數(shù)據(jù)位置不再是物理位置,而是主鍵值,所以對于索引組織表來說,主鍵的值不能太大,否則占用的空間比較大。

對于索引組織表來說,如果每次在中間插入數(shù)據(jù),可能會(huì)導(dǎo)致索引分裂,索引分裂會(huì)大大降低插入的性能。所以對于使用innodb來說,我們一般最好讓主鍵是一個(gè)無意義的序列,這樣插入每次都發(fā)生在最后,以避免這個(gè)問題。

由于索引組織表是按一個(gè)索引樹,一般它訪問數(shù)據(jù)塊必須按數(shù)據(jù)塊之間的關(guān)系進(jìn)行訪問,而不是按物理塊的訪問數(shù)據(jù)的,所以當(dāng)做全表掃描時(shí)要比堆表慢很多,這可能在OLTP中不明顯,但在數(shù)據(jù)倉庫的應(yīng)用中可能是一個(gè)問題。

  PostgreSQL9.0中的特色功能:

PostgreSQL中的Hot Standby功能

也就是standby在應(yīng)用日志同步時(shí),還可以提供只讀服務(wù),這對做讀寫分離很有用。這個(gè)功能是oracle11g才有的功能。

PostgreSQL異步提交(Asynchronous Commit)的功能:

  這個(gè)功能oracle中也是到oracle11g R2才有的功能。因?yàn)樵诤芏鄳?yīng)用場景中,當(dāng)宕機(jī)時(shí)是允許丟失少量數(shù)據(jù)的,這個(gè)功能在這樣的場景中就特別合適。在PostgreSQL9.0中把synchronous_commit設(shè)置為false就打開了這個(gè)功能。需要注意的是,雖然設(shè)置為了異步提交,當(dāng)主機(jī)宕機(jī)時(shí),PostgreSQL只會(huì)丟失少量數(shù)據(jù),異步提交并不會(huì)導(dǎo)致數(shù)據(jù)損壞而數(shù)據(jù)庫起不來的情況。MySQL中沒有聽說過有這個(gè)功能。

PostgreSQL中索引的特色功能:

PostgreSQL中可以有部分索引,也就是只能表中的部分?jǐn)?shù)據(jù)做索引,create index 可以帶where 條件。同時(shí)PostgreSQL中的索引可以反向掃描,所以在PostgreSQL中可以不必建專門的降序索引了。

為什么postgrelsql的性能沒有mysql好

一、 PostgreSQL 的穩(wěn)定性極強(qiáng), Innodb 等引擎在崩潰、斷電之類的災(zāi)難場景下抗打擊能力有了長足進(jìn)步,然而很多 MySQL 用戶都遇到過Server級(jí)的數(shù)據(jù)庫丟失的場景——mysql系統(tǒng)庫是MyISAM的,相比之下,PG數(shù)據(jù)庫這方面要好一些。

二、任何系統(tǒng)都有它的性能極限,在高并發(fā)讀寫,負(fù)載逼近極限下,PG的性能指標(biāo)仍可以維持雙曲線甚至對數(shù)曲線,到頂峰之后不再下降,而 MySQL 明顯出現(xiàn)一個(gè)波峰后下滑(5.5版本之后,在企業(yè)級(jí)版本中有個(gè)插件可以改善很多,不過需要付費(fèi))。

三、PG 多年來在 GIS 領(lǐng)域處于優(yōu)勢地位,因?yàn)樗胸S富的幾何類型,實(shí)際上不止幾何類型,PG有大量字典、數(shù)組、bitmap 等數(shù)據(jù)類型,相比之下mysql就差很多,instagram就是因?yàn)镻G的空間數(shù)據(jù)庫擴(kuò)展POSTGIS遠(yuǎn)遠(yuǎn)強(qiáng)于MYSQL的my spatial而采用PGSQL的。

四、PG 的“無鎖定”特性非常突出,甚至包括 vacuum 這樣的整理數(shù)據(jù)空間的操作,這個(gè)和PGSQL的MVCC實(shí)現(xiàn)有關(guān)系。

五、PG 的可以使用函數(shù)和條件索引,這使得PG數(shù)據(jù)庫的調(diào)優(yōu)非常靈活,mysql就沒有這個(gè)功能,條件索引在web應(yīng)用中很重要。

六、PG有極其強(qiáng)悍的 SQL 編程能力(9.x 圖靈完備,支持遞歸?。蟹浅XS富的統(tǒng)計(jì)函數(shù)和統(tǒng)計(jì)語法支持,比如分析函數(shù)(ORACLE的叫法,PG里叫window函數(shù)),還可以用多種語言來寫存儲(chǔ)過程,對于R的支持也很好。這一點(diǎn)上MYSQL就差的很遠(yuǎn),很多分析功能都不支持,騰訊內(nèi)部數(shù)據(jù)存儲(chǔ)主要是MYSQL,但是數(shù)據(jù)分析主要是HADOOP+PGSQL。

七、PG 的有多種集群架構(gòu)可以選擇,plproxy 可以支持語句級(jí)的鏡像或分片,slony 可以進(jìn)行字段級(jí)的同步設(shè)置,standby 可以構(gòu)建WAL文件級(jí)或流式的讀寫分離集群,同步頻率和集群策略調(diào)整方便,操作非常簡單。

八、一般關(guān)系型數(shù)據(jù)庫的字符串有限定長度8k左右,無限長 TEXT 類型的功能受限,只能作為外部大數(shù)據(jù)訪問。而 PG 的 TEXT 類型可以直接訪問,SQL語法內(nèi)置正則表達(dá)式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話,文檔數(shù)據(jù)庫都可以省了。

九,對于WEB應(yīng)用來說,復(fù)制的特性很重要,mysql到現(xiàn)在也是異步復(fù)制,pgsql可以做到同步,異步,半同步復(fù)制。還有mysql的同步是基于binlog復(fù)制,類似oracle golden gate,是基于stream的復(fù)制,做到同步很困難,這種方式更加適合異地復(fù)制,pgsql的復(fù)制基于wal,可以做到同步復(fù)制。同時(shí),pgsql還提供stream復(fù)制。

十,pgsql對于numa架構(gòu)的支持比mysql強(qiáng)一些,比MYSQL對于讀的性能更好一些,pgsql提交可以完全異步,而mysql的內(nèi)存表不夠?qū)嵱茫ㄒ驗(yàn)楸礞i的原因)

最后說一下我感覺 PG 不如 MySQL 的地方。

第一,MySQL有一些實(shí)用的運(yùn)維支持,如 slow-query.log ,這個(gè)pg肯定可以定制出來,但是如果可以配置使用就更好了。

第二是mysql的innodb引擎,可以充分優(yōu)化利用系統(tǒng)所有內(nèi)存,超大內(nèi)存下PG對內(nèi)存使用的不那么充分,

第三點(diǎn),MySQL的復(fù)制可以用多級(jí)從庫,但是在9.2之前,PGSQL不能用從庫帶從庫。

第四點(diǎn),從測試結(jié)果上看,mysql 5.5的性能提升很大,單機(jī)性能強(qiáng)于pgsql,5.6應(yīng)該會(huì)強(qiáng)更多.

第五點(diǎn),對于web應(yīng)用來說,mysql 5.6 的內(nèi)置MC API功能很好用,PGSQL差一些。

另外一些:

pgsql和mysql都是背后有商業(yè)公司,而且都不是一個(gè)公司。大部分開發(fā)者,都是拿工資的。

說mysql的執(zhí)行速度比pgsql快很多是不對的,速度接近,而且很多時(shí)候取決于你的配置。

對于存儲(chǔ)過程,函數(shù),視圖之類的功能,現(xiàn)在兩個(gè)數(shù)據(jù)庫都可以支持了。

另外多線程架構(gòu)和多進(jìn)程架構(gòu)之間沒有絕對的好壞,oracle在unix上是多進(jìn)程架構(gòu),在windows上是多線程架構(gòu)。

很多pg應(yīng)用也是24/7的應(yīng)用,比如skype. 最近幾個(gè)版本VACUUM基本不影響PGSQL 運(yùn)行,8.0之后的PGSQL不需要cygwin就可以在windows上運(yùn)行。

至于說對于事務(wù)的支持,mysql和pgsql都沒有問題。

如何設(shè)置postgres 連接池 spring

安裝PostgreSQL數(shù)據(jù)庫之后,默認(rèn)是只接受本地訪問連接。如果想在其他主機(jī)上訪問PostgreSQL數(shù)據(jù)庫服務(wù)器,就需要進(jìn)行相 應(yīng)的配置。配置遠(yuǎn)程連接PostgreSQL數(shù)據(jù)庫的步驟很簡單,只需要修改data目錄下的pg_hba.conf和postgresql.conf, 其中pg_hba.conf是用來配置對數(shù)據(jù)庫的訪問權(quán)限,postgresql.conf文件用來配置PostgreSQL數(shù)據(jù)庫服務(wù)器的相應(yīng)的參數(shù)。 下面介紹配置的步驟:

1.修改pg_hba.conf文件,配置用戶的訪問權(quán)限:

# TYPE DATABASE USER CIDR-ADDRESS METHOD

# "local" is for Unix domain socket connections only

local all all trust

# IPv4 local connections:

host all all 127.0.0.1/32 trust

host all all 192.168.1.0/24 md5

# IPv6 local connections:

host all all ::1/128 trust

其中紅色標(biāo)識(shí)的內(nèi)容為新添加的內(nèi)容,表示允許網(wǎng)段192.168.1.0上的所有主機(jī)使用所有合法的數(shù)據(jù)庫用戶名訪問數(shù)據(jù)庫,并提供加密的密碼驗(yàn) 證。在我們的環(huán)境中,我們需要在主機(jī)192.168.1.5上使用postgres用戶訪問192.168.1.9上的PostgreSQL數(shù)據(jù)庫。

2.修改postgresql.conf文件,將數(shù)據(jù)庫服務(wù)器的監(jiān)聽模式修改為監(jiān)聽所有主機(jī)發(fā)出的連接請求。

定位到#listen_addresses='localhost'。PostgreSQL安裝完成后,默認(rèn)是只接受來在本機(jī)localhost的連接請 求,通過將改行內(nèi)容修改為listen_addresses='*'來允許數(shù)據(jù)庫服務(wù)器監(jiān)聽來自任何主機(jī)的連接請求:

listen_addresses = '*' # what IP address(es) to listen on;

# comma-separated list of addresses;

# defaults to 'localhost', '*' = all

# (change requires restart)

修改之后,保存并退出,然后重起數(shù)據(jù)庫,就可以在在遠(yuǎn)程機(jī)器上訪問PostgreSQL數(shù)據(jù)庫了。

另外,數(shù)據(jù)庫管理小貼士:

matrix數(shù)據(jù)庫使用的是PostgreSQL數(shù)據(jù)庫。你可以安裝一個(gè)類似phpmyadmin的管理

使用Go實(shí)現(xiàn)一個(gè)數(shù)據(jù)庫連接池

開始本文之前,我們看一段Go連接數(shù)據(jù)庫的代碼:

本文內(nèi)容我們將解釋連接池背后是如何工作的,并 探索 如何配置數(shù)據(jù)庫能改變或優(yōu)化其性能。

轉(zhuǎn)自:

整理:地鼠文檔:

那么sql.DB連接池是如何工作的呢?

需要理解的最重要一點(diǎn)是,sql.DB池包含兩種類型的連接——“正在使用”連接和“空閑”連接。當(dāng)您使用連接執(zhí)行數(shù)據(jù)庫任務(wù)(例如執(zhí)行SQL語句或查詢行)時(shí),該連接被標(biāo)記為正在使用,任務(wù)完成后,該連接被標(biāo)記為空閑。

當(dāng)您使用Go執(zhí)行數(shù)據(jù)庫操作時(shí),它將首先檢查池中是否有可用的空閑連接。如果有可用的連接,那么Go將重用這個(gè)現(xiàn)有連接,并在任務(wù)期間將其標(biāo)記為正在使用。如果在您需要空閑連接時(shí)池中沒有空閑連接,那么Go將創(chuàng)建一個(gè)新的連接。

當(dāng)Go重用池中的空閑連接時(shí),與該連接有關(guān)的任何問題都會(huì)被優(yōu)雅地處理。異常連接將在放棄之前自動(dòng)重試兩次,這時(shí)Go將從池中刪除異常連接并創(chuàng)建一個(gè)新的連接來執(zhí)行該任務(wù)。

連接池有四個(gè)方法,我們可以使用它們來配置連接池的行為。讓我們一個(gè)一個(gè)地來討論。

SetMaxOpenConns()方法允許您設(shè)置池中“打開”連接(使用中+空閑連接)數(shù)量的上限。默認(rèn)情況下,打開的連接數(shù)是無限的。

一般來說,MaxOpenConns設(shè)置得越大,可以并發(fā)執(zhí)行的數(shù)據(jù)庫查詢就越多,連接池本身成為應(yīng)用程序中的瓶頸的風(fēng)險(xiǎn)就越低。

但讓它無限并不是最好的選擇。默認(rèn)情況下,PostgreSQL最多100個(gè)打開連接的硬限制,如果達(dá)到這個(gè)限制的話,它將導(dǎo)致pq驅(qū)動(dòng)返回”sorry, too many clients already”錯(cuò)誤。

為了避免這個(gè)錯(cuò)誤,將池中打開的連接數(shù)量限制在100以下是有意義的,可以為其他需要使用PostgreSQL的應(yīng)用程序或會(huì)話留下足夠的空間。

設(shè)置MaxOpenConns限制的另一個(gè)好處是,它充當(dāng)一個(gè)非常基本的限流器,防止數(shù)據(jù)庫同時(shí)被大量任務(wù)壓垮。

但設(shè)定上限有一個(gè)重要的警告。如果達(dá)到MaxOpenConns限制,并且所有連接都在使用中,那么任何新的數(shù)據(jù)庫任務(wù)將被迫等待,直到有連接空閑。在我們的API上下文中,用戶的HTTP請求可能在等待空閑連接時(shí)無限期地“掛起”。因此,為了緩解這種情況,使用上下文為數(shù)據(jù)庫任務(wù)設(shè)置超時(shí)是很重要的。我們將在書的后面解釋如何處理。

SetMaxIdleConns()方法的作用是:設(shè)置池中空閑連接數(shù)的上限。缺省情況下,最大空閑連接數(shù)為2。

理論上,在池中允許更多的空閑連接將增加性能。因?yàn)樗鼫p少了從頭建立新連接發(fā)生概率—,因此有助于節(jié)省資源。

但要意識(shí)到保持空閑連接是有代價(jià)的。它占用了本來可以用于應(yīng)用程序和數(shù)據(jù)庫的內(nèi)存,而且如果一個(gè)連接空閑時(shí)間過長,它也可能變得不可用。例如,默認(rèn)情況下MySQL會(huì)自動(dòng)關(guān)閉任何8小時(shí)未使用的連接。

因此,與使用更小的空閑連接池相比,將MaxIdleConns設(shè)置得過高可能會(huì)導(dǎo)致更多的連接變得不可用,浪費(fèi)資源。因此保持適量的空閑連接是必要的。理想情況下,你只希望保持一個(gè)連接空閑,可以快速使用。

另一件要指出的事情是MaxIdleConns值應(yīng)該總是小于或等于MaxOpenConns。Go會(huì)強(qiáng)制保證這點(diǎn),并在必要時(shí)自動(dòng)減少M(fèi)axIdleConns值。

SetConnMaxLifetime()方法用于設(shè)置ConnMaxLifetime的極限值,表示一個(gè)連接保持可用的最長時(shí)間。默認(rèn)連接的存活時(shí)間沒有限制,永久可用。

如果設(shè)置ConnMaxLifetime的值為1小時(shí),意味著所有的連接在創(chuàng)建后,經(jīng)過一個(gè)小時(shí)就會(huì)被標(biāo)記為失效連接,標(biāo)志后就不可復(fù)用。但需要注意:

理論上,ConnMaxLifetime為無限大(或設(shè)置為很長生命周期)將提升性能,因?yàn)檫@樣可以減少新建連接。但是在某些情況下,設(shè)置短期存活時(shí)間有用。比如:

如果您決定對連接池設(shè)置ConnMaxLifetime,那么一定要記住連接過期(然后重新創(chuàng)建)的頻率。例如,如果連接池中有100個(gè)打開的連接,而ConnMaxLifetime為1分鐘,那么您的應(yīng)用程序平均每秒可以殺死并重新創(chuàng)建多達(dá)1.67個(gè)連接。您不希望頻率太大而最終影響性能吧。

SetConnMaxIdleTime()方法在Go 1.15版本引入對ConnMaxIdleTime進(jìn)行配置。其效果和ConnMaxLifeTime類似,但這里設(shè)置的是:在被標(biāo)記為失效之前一個(gè)連接最長空閑時(shí)間。例如,如果我們將ConnMaxIdleTime設(shè)置為1小時(shí),那么自上次使用以后在池中空閑了1小時(shí)的任何連接都將被標(biāo)記為過期并被后臺(tái)清理操作刪除。

這個(gè)配置非常有用,因?yàn)樗馕吨覀兛梢詫Τ刂锌臻e連接的數(shù)量設(shè)置相對較高的限制,但可以通過刪除不再真正使用的空閑連接來周期性地釋放資源。

所以有很多信息要吸收。這在實(shí)踐中意味著什么?我們把以上所有的內(nèi)容總結(jié)成一些可行的要點(diǎn)。

1、根據(jù)經(jīng)驗(yàn),您應(yīng)該顯式地設(shè)置MaxOpenConns值。這個(gè)值應(yīng)該低于數(shù)據(jù)庫和操作系統(tǒng)對連接數(shù)量的硬性限制,您還可以考慮將其保持在相當(dāng)?shù)偷乃剑猿洚?dāng)基本的限流作用。

對于本書中的項(xiàng)目,我們將MaxOpenConns限制為25個(gè)連接。我發(fā)現(xiàn)這對于小型到中型的web應(yīng)用程序和API來說是一個(gè)合理的初始值,但理想情況下,您應(yīng)該根據(jù)基準(zhǔn)測試和壓測結(jié)果調(diào)整這個(gè)值。

2、通常,更大的MaxOpenConns和MaxIdleConns值會(huì)帶來更好的性能。但是,效果是逐漸降低的,而且您應(yīng)該注意,太多的空閑連接(連接沒有被復(fù)用)實(shí)際上會(huì)導(dǎo)致性能下降和不必要的資源消耗。

因?yàn)镸axIdleConns應(yīng)該總是小于或等于MaxOpenConns,所以對于這個(gè)項(xiàng)目,我們還將MaxIdleConns限制為25個(gè)連接。

3、為了降低上面第2點(diǎn)的風(fēng)險(xiǎn),通常應(yīng)該設(shè)置ConnMaxIdleTime值來刪除長時(shí)間未使用的空閑連接。在這個(gè)項(xiàng)目中,我們將設(shè)置ConnMaxIdleTime持續(xù)時(shí)間為15分鐘。

4、ConnMaxLifetime默認(rèn)設(shè)置為無限大是可以的,除非您的數(shù)據(jù)庫對連接生命周期施加了硬限制,或者您需要它協(xié)助一些操作,比如優(yōu)雅地交換數(shù)據(jù)庫。這些都不適用于本項(xiàng)目,所以我們將保留這個(gè)默認(rèn)的無限制配置。

與其硬編碼這些配置,不如更新cmd/api/main.go文件通過命令行參數(shù)讀取配置。

ConnMaxIdleTime值比較有意思,因?yàn)槲覀兿M鼈鬟f一段時(shí)間,最終需要將其轉(zhuǎn)換為Go的time.Duration類型。這里有幾個(gè)選擇:

1、我們可以使用一個(gè)整數(shù)來表示秒(或分鐘)的數(shù)量,并將其轉(zhuǎn)換為time.Duration。

2、我們可以使用一個(gè)表示持續(xù)時(shí)間的字符串——比如“5s”(5秒)或“10m”(10分鐘)——然后使用time.ParseDuration()函數(shù)解析它。

3、兩種方法都可以很好地工作,但是在這個(gè)項(xiàng)目中我們將使用選項(xiàng)2。繼續(xù)并更新cmd/api/main.go文件如下:

File: cmd/api/main.go


網(wǎng)頁標(biāo)題:postgresql池的簡單介紹
文章位置:http://weahome.cn/article/dscdseg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部