教面試官ReentrantLock源碼
900
2025-04-05
【引言】
最近收到一個(gè)調(diào)研需求,是關(guān)于JNDI綁定數(shù)據(jù)源程序庫(kù)可行性替換研究,目前我們需要替換的程序庫(kù)名稱(chēng)是c3p0。本文我們就來(lái)探索一下這個(gè)問(wèn)題。
【C3P0】
c3p0是一個(gè)易于使用的,用于JNDI綁定數(shù)據(jù)源來(lái)增強(qiáng)傳統(tǒng)的JDBC驅(qū)動(dòng)的程序庫(kù),它包括實(shí)現(xiàn)jdbc3規(guī)范和jdbc2?標(biāo)準(zhǔn)擴(kuò)展所描述的連接和語(yǔ)句集合的數(shù)據(jù)源。
它是一個(gè)成熟的、高度并發(fā)的JDBC連接池庫(kù),支持緩存和重用PreparedStatements。
它使用LGPL v.2.1?或?EPL v.1.0授權(quán)的方式。
【官方網(wǎng)站】
https://www.mchange.com/projects/c3p0/
【License】
LGPL v2.1?或EPL v1.0
【最新發(fā)布】
0.9.5.5?于?2019年12月
【功能列表】
c3p0通過(guò)對(duì)傳統(tǒng)的JDBC驅(qū)動(dòng)進(jìn)行?"企業(yè)級(jí)?"的擴(kuò)展,使其具備jdbc3規(guī)范和jdbc2的可選擴(kuò)展功能。
從0.9.5版本開(kāi)始,c3p0完全支持jdbc4規(guī)范。
特別是,c3p0提供了幾個(gè)有用的服務(wù):
l??通過(guò)一個(gè)類(lèi)將傳統(tǒng)的基于DriverManager的JDBC驅(qū)動(dòng)適配到最新的javax.sql.DataSource方案中,用來(lái)獲取數(shù)據(jù)庫(kù)連接。
l??把DataSources背后的Connection和PreparedStatements透明池化,這里的DataSources可以?"包裹"傳統(tǒng)驅(qū)動(dòng)或任意的非池化的DataSources。
該庫(kù)的細(xì)節(jié)處理:
l??c3p0 DataSources既是可引用的,也是可序列化的,因此適合于綁定到各種基于JNDI的命名服務(wù)。
l??當(dāng)池化的鏈接和Statements在進(jìn)行檢入時(shí),?Statement和ResultSets被仔細(xì)清理,以防止客戶(hù)端使用惰性時(shí)可能引起的資源枯竭。
l??該庫(kù)采用了JDBC 2和3規(guī)范。DataSources是以JavaBean風(fēng)格編寫(xiě)的,提供了必要的和大部分可選的屬性,并且沒(méi)有參數(shù)構(gòu)造函數(shù)。?所有JDBC定義的內(nèi)部接口都已實(shí),如ConnectionPoolDataSource、PooledConnection、ConnectionEvent-generating Connections等。
【使用示例】
配置1
ComboPooledDataSource?cpds?=?new?ComboPooledDataSource();
cpds.setDriverClass(?"org.postgresql.Driver"?);?//loads?the?jdbc?driver
cpds.setJdbcUrl(?"jdbc:postgresql://localhost/testdb"?);
cpds.setUser("dbuser");
cpds.setPassword("dbpassword");
配置2
DataSource?ds_unpooled?=?DataSources.unpooledDataSource("jdbc:postgresql://localhost/testdb",
"swaldman",
"test-password");
DataSource?ds_pooled?=?DataSources.pooledDataSource(?ds_unpooled?);
更多配置可以參看官方網(wǎng)站。
【HikariCP】
HikariCP是一個(gè)堅(jiān)實(shí)的、高性能的JDBC連接池。
它的特點(diǎn)是快速、簡(jiǎn)單、可靠。
HikariCP是一個(gè)?"零開(kāi)銷(xiāo)"的生產(chǎn)型JDBC連接庫(kù)。大約130Kb,是個(gè)非常輕的程序庫(kù)。
【官方網(wǎng)站】
https://github.com/brettwooldridge/HikariCP
【License】
Apache 2.0
【最新發(fā)布】
3.4.5?于?2020年5月4日
【功能列表】
HikariCP依賴(lài)于精確的定時(shí)器來(lái)提高性能和保證可靠性。
l??您的服務(wù)器必須與時(shí)間源同步,如NTP服務(wù)器等。
l??特別是如果你的服務(wù)器是在虛擬機(jī)中運(yùn)行的時(shí)候,不要依賴(lài)hypervisor設(shè)置來(lái)?"同步"虛擬機(jī)的時(shí)鐘,而要在虛擬機(jī)內(nèi)部配置時(shí)間源同步。
HikariCP自帶了合理的默認(rèn)值,在大多數(shù)部署中表現(xiàn)良好,無(wú)需額外調(diào)整。除了下面標(biāo)注的?"必需項(xiàng)"之外,其他屬性都是可選的。
必選項(xiàng)
以下的dataSourceClassName和jdbcUrl任選其一即可。
這是JDBC驅(qū)動(dòng)提供的DataSource類(lèi)的名稱(chēng)。請(qǐng)參考您的特定JDBC驅(qū)動(dòng)程序的文檔來(lái)獲取這個(gè)類(lèi)的名稱(chēng),或查看下面的表格。
數(shù)據(jù)庫(kù)
驅(qū)動(dòng)
DataSource?類(lèi)
Apache Derby
Derby
org.apache.derby.jdbc.ClientDataSource
Firebird
Jaybird
org.firebirdsql.ds.FBSimpleDataSource
H2
H2
org.h2.jdbcx.JdbcDataSource
HSQLDB
HSQLDB
org.hsqldb.jdbc.JDBCDataSource
IBM DB2
IBM JCC
com.ibm.db2.jcc.DB2SimpleDataSource
IBM Informix
IBM Informix
com.informix.jdbcx.IfxDataSource
MS SQL Server
Microsoft
com.microsoft.sqlserver.jdbc.SQLServerDataSource
MariaDB
MariaDB
org.mariadb.jdbc.MariaDbDataSource
Oracle
Oracle
oracle.jdbc.pool.OracleDataSource
OrientDB
OrientDB
com.orientechnologies.orient.jdbc.OrientDataSource
PostgreSQL
pgjdbc-ng
com.impossibl.postgres.jdbc.PGDataSource
PostgreSQL
PostgreSQL
org.postgresql.ds.PGSimpleDataSource
SAP MaxDB
SAP
com.sap.dbtech.jdbc.DriverSapDB
SQLite
xerial
org.sqlite.SQLiteDataSource
SyBase
jConnect
com.sybase.jdbc4.jdbc.SybDataSource
對(duì)于MySQL,目前只有jdbcUrl方式可用。
這個(gè)屬性指示HikariCP使用?"基于驅(qū)動(dòng)程序管理器"的配置。當(dāng)使用該屬性與?"舊"驅(qū)動(dòng)時(shí),你可能還需要設(shè)置driverClassName屬性,但先嘗試不使用該屬性。請(qǐng)注意,如果使用了這個(gè)屬性,您仍然可以使用DataSource屬性來(lái)配置您的驅(qū)動(dòng)程序,事實(shí)上,建議您使用DataSource屬性而不是在URL本身指定的驅(qū)動(dòng)程序參數(shù)。
另外的兩個(gè)必選項(xiàng)是username和password。
其他的更多選項(xiàng),可以參看官方網(wǎng)站。
【使用示例】
Maven?安裝
配置1:
HikariConfig?config?=?new?HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
config.setUsername("bart");
config.setPassword("51mp50n");
config.addDataSourceProperty("cachePrepStmts",?"true");
config.addDataSourceProperty("prepStmtCacheSize",?"250");
config.addDataSourceProperty("prepStmtCacheSqlLimit",?"2048");
HikariDataSource?ds?=?new?HikariDataSource(config);
配置2:
HikariDataSource?ds?=?new?HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
ds.setUsername("bart");
ds.setPassword("51mp50n");
...
配置3:
屬性值:
dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
dataSource.user=test
dataSource.password=test
dataSource.databaseName=mydb
dataSource.portNumber=5432
dataSource.serverName=localhost
HikariConfig?config?=?new?HikariConfig("/some/path/hikari.properties");
HikariDataSource?ds?=?new?HikariDataSource(config);
配置4:
Properties?props?=?new?Properties();
props.setProperty("dataSourceClassName",?"org.postgresql.ds.PGSimpleDataSource");
props.setProperty("dataSource.user",?"test");
props.setProperty("dataSource.password",?"test");
props.setProperty("dataSource.databaseName",?"mydb");
props.put("dataSource.logWriter",?new?PrintWriter(System.out));
HikariConfig?config?=?new?HikariConfig(props);
HikariDataSource?ds?=?new?HikariDataSource(config);
【性能對(duì)比】
以下是JDBC連接池的JHM基準(zhǔn)測(cè)試結(jié)果。
更多詳情可以參看其官方網(wǎng)站:
https://github.com/brettwooldridge/HikariCP-benchmark
【小結(jié)】
本文對(duì)數(shù)據(jù)源程序庫(kù)做了替換可行性的研究,目前對(duì)于替換C3P0程序庫(kù)來(lái)說(shuō),比較好的選項(xiàng)是HikariCP。
希望本文對(duì)業(yè)務(wù)開(kāi)發(fā)有指導(dǎo)作用,?并對(duì)大家有所裨益。
歡迎討論。
軟件開(kāi)發(fā)
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。