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

举报
技术火炬手 发表于 2020/09/29 14:16:18 2020/09/29
【摘要】 最近收到一个调研需求,是关于JNDI绑定数据源程序库可行性替换研究,目前我们需要替换的程序库名称是c3p0。本文我们就来探索一下这个问题。

【引言】

最近收到一个调研需求,是关于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  201912

【功能列表】

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

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

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

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

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

该库的细节处理:

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

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

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

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

HikariCP

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

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

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

【官方网站】

https://github.com/brettwooldridge/HikariCP

License

Apache 2.0

【最新发布】

3.4.5  202054

【功能列表】

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

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

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

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

必选项

以下的dataSourceClassNamejdbcUrl任选其一即可。

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本身指定的驱动程序参数。

另外的两个必选项是usernamepassword

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

【使用示例】

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

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

欢迎讨论。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。