数据源程序库可行性替换研究

网友投稿 772 2022-05-30

【引言】

最近收到一个调研需求,是关于JNDI绑定数据源程序库可行性替换研究,目前我们需要替换的程序库名称是c3p0。本文我们就来探索一下这个问题。

【C3P0】

c3p0是一个易于使用的,用于JNDI绑定数据源来增强传统的JDBC驱动的程序库,它包括实现jdbc3规范和jdbc2 标准扩展所描述的连接和语句集合的数据源。

它是一个成熟的、高度并发的JDBC连接池库,支持缓存和重用PreparedStatements。

它使用LGPL v.2.1 或 EPL v.1.0授权的方式。

【官方网站】

https://www.mchange.com/projects/c3p0/

【License】

LGPL v2.1 或EPL v1.0

【最新发布】

0.9.5.5 于 2019年12月

【功能列表】

c3p0通过对传统的JDBC驱动进行 "企业级 "的扩展,使其具备jdbc3规范和jdbc2的可选扩展功能。

从0.9.5版本开始,c3p0完全支持jdbc4规范。

特别是,c3p0提供了几个有用的服务:

l  通过一个类将传统的基于DriverManager的JDBC驱动适配到最新的javax.sql.DataSource方案中,用来获取数据库连接。

l  把DataSources背后的Connection和PreparedStatements透明池化,这里的DataSources可以 "包裹"传统驱动或任意的非池化的DataSources。

该库的细节处理:

l  c3p0 DataSources既是可引用的,也是可序列化的,因此适合于绑定到各种基于JNDI的命名服务。

l  当池化的链接和Statements在进行检入时, Statement和ResultSets被仔细清理,以防止客户端使用惰性时可能引起的资源枯竭。

l  该库采用了JDBC 2和3规范。DataSources是以JavaBean风格编写的,提供了必要的和大部分可选的属性,并且没有参数构造函数。 所有JDBC定义的内部接口都已实,如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 );

更多配置可以参看官方网站。

【HikariCP】

HikariCP是一个坚实的、高性能的JDBC连接池。

它的特点是快速、简单、可靠。

HikariCP是一个 "零开销"的生产型JDBC连接库。大约130Kb,是个非常轻的程序库。

【官方网站】

https://github.com/brettwooldridge/HikariCP

【License】

Apache 2.0

【最新发布】

3.4.5 于 2020年5月4日

【功能列表】

HikariCP依赖于精确的定时器来提高性能和保证可靠性。

l  您的服务器必须与时间源同步,如NTP服务器等。

l  特别是如果你的服务器是在虚拟机中运行的时候,不要依赖hypervisor设置来 "同步"虚拟机的时钟,而要在虚拟机内部配置时间源同步。

HikariCP自带了合理的默认值,在大多数部署中表现良好,无需额外调整。除了下面标注的 "必需项"之外,其他属性都是可选的。

必选项

以下的dataSourceClassName和jdbcUrl任选其一即可。

这是JDBC驱动提供的DataSource类的名称。请参考您的特定JDBC驱动程序的文档来获取这个类的名称,或查看下面的表格。

数据库

驱动

DataSource 类

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

对于MySQL,目前只有jdbcUrl方式可用。

这个属性指示HikariCP使用 "基于驱动程序管理器"的配置。当使用该属性与 "旧"驱动时,你可能还需要设置driverClassName属性,但先尝试不使用该属性。请注意,如果使用了这个属性,您仍然可以使用DataSource属性来配置您的驱动程序,事实上,建议您使用DataSource属性而不是在URL本身指定的驱动程序参数。

另外的两个必选项是username和password。

其他的更多选项,可以参看官方网站。

【使用示例】

Maven 安装

com.zaxxer

HikariCP

3.4.5

配置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);

【性能对比】

以下是JDBC连接池的JHM基准测试结果。

更多详情可以参看其官方网站:

https://github.com/brettwooldridge/HikariCP-benchmark

【小结】

本文对数据源程序库做了替换可行性的研究,目前对于替换C3P0程序库来说,比较好的选项是HikariCP。

希望本文对业务开发有指导作用, 并对大家有所裨益。

欢迎讨论。

软件开发

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Qcon全国软件开发大会会议快报
下一篇:Java——泛型基本总结(通配符、泛型接口、泛型方法)
相关文章