数据源程序库可行性替换研究
【引言】
最近收到一个调研需求,是关于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任选其一即可。
dataSourceClassName
这是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方式可用。
jdbcUrl
这个属性指示HikariCP使用 "基于驱动程序管理器"的配置。当使用该属性与 "旧"驱动时,你可能还需要设置driverClassName属性,但先尝试不使用该属性。请注意,如果使用了这个属性,您仍然可以使用DataSource属性来配置您的驱动程序,事实上,建议您使用DataSource属性而不是在URL本身指定的驱动程序参数。
另外的两个必选项是username和password。
其他的更多选项,可以参看官方网站。
【使用示例】
Maven 安装
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.4.5</version>
</dependency>
配置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。
希望本文对业务开发有指导作用, 并对大家有所裨益。
欢迎讨论。
- 点赞
- 收藏
- 关注作者
评论(0)