HikariCP
为何要使用HiKariCP?这要先从BoneCP说起:
什么?不是有C3P0/DBCP这些成熟的数据库连接池吗?一直用的好好的,为什么又搞出一个BoneCP来?因为,传说中BoneCP在快速这个特点上做到了极致,官方数据是C3P0等的25倍左右。不相信?其实我也不怎么信。可是,有图有真相啊(图片来自BoneCP官网:http://jolbox.com/benchmarks.html):
英文:
constrained 不舒服的,被强迫的,拘泥的;
- 字节码精简:优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码;
- 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一;
- 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描;
- 自定义集合类型(ConcurrentBag):提高并发读写的效率;
- 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究(但没说具体怎么优化)。
使用方法:
you can use the HikariConfig
class like so:
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);
or directly instantiate a HikariDataSource
like so:
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
ds.setUsername("bart");
ds.setPassword("51mp50n");
...
or property file based:
HikariConfig config = new HikariConfig("some/path/hikari.properties");
HikariDataSource ds = new HikariDataSource(config);
Example property file:
dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
dataSource.user=test
dataSource.password=test
dataSource.databaseName=mydb
dataSource.portNumber=5432
dataSource.serverName=localhost
- <!-- Hikari Datasource -->
- <bean id="dataSourceHikari" class="com.zaxxer.hikari.HikariDataSource" destroy-method="shutdown">
- <!-- <property name="driverClassName" value="${db.driverClass}" /> --> <!-- 无需指定,除非系统无法自动识别 -->
- <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8" />
- <property name="username" value="${db.username}" />
- <property name="password" value="${db.password}" />
- <!-- 连接只读数据库时配置为true, 保证安全 -->
- <property name="readOnly" value="false" />
- <!-- 等待连接池分配连接的最大时长(毫秒),超过这个时长还没可用的连接则发生SQLException, 缺省:30秒 -->
- <property name="connectionTimeout" value="30000" />
- <!-- 一个连接idle状态的最大时长(毫秒),超时则被释放(retired),缺省:10分钟 -->
- <property name="idleTimeout" value="600000" />
- <!-- 一个连接的生命时长(毫秒),超时而且没被使用则被释放(retired),缺省:30分钟,建议设置比数据库超时时长少30秒,参考MySQL wait_timeout参数(show variables like '%timeout%';) -->
- <property name="maxLifetime" value="1800000" />
- <!-- 连接池中允许的最大连接数。缺省值:10;推荐的公式:((core_count * 2) + effective_spindle_count) -->
- <property name="maximumPoolSize" value="15" />
- </bean>
下载地址及依赖环境
======================1 下载地址
http://mvnrepository.com/artifact/com.zaxxer/HikariCP
2 Git主页
https://github.com/brettwooldridge/HikariCP
3 依赖包
log4j-1.2.16.jar
slf4j-api-1.5.10.jar
slf4j-log4j12-1.5.10.jar
4 版本支持
Java 7 and Java 8 maven artifact:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.4.5</version>
</dependency>
Java 6 maven artifact (maintenance mode):
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.3.13</version>
</dependency>
What do “Connection Cycle ops/ms” and “Statement Cycle ops/ms” mean in the context of a microbenchmark of a connection pool?
In the context of a pool, we're trying to measure just the speed of pool operations -- so a "no-op" DataSource is used that does not perform actually connections or SQL. Connection Cycles measures how fast a connection can be obtained from the pool and then returned. Basically, this:
Connection conn = dataSource.getConnection();
conn.close();
Where dataSource
is a HikariDataSource (pool) and conn.close()
actually returns the Connection to the pool instead of closing the underlying DB Connection.
The Statement Cycle benchmark performs:
Statement statement = connection.createStatement();
statement.execute();
statement.close();
Because connection pools wrap Statement
(and it's subclasses) with proxies, and track them so that they can be closed when the Connection is closed, there is overhead associated with both tracking the Statement
and invoking against it. This micro-benchmark measures both.
proxool
更新时间截止2008年。速度可以,稳定性稍差,发较高的情况下会出错。
c3p0
太古老,代码及其复杂,不利于维护。貌似都比它强。
dbcp
是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。
druid
功能比较全面,且扩展性较好,比较方便对jdbc接口进行监控跟踪等。
BoneCP
13年前最快的连接池项目。2013年后不再更新,心灰意冷。
HikariCP
光连接池