MRS 3.X集群Spark on CloudTable使用指导
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 安装
配置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小时内删除侵权内容。