上一篇文章《Java API 简单例子》之中,我们介绍了使用Java API 对Cassandra的简单操作。 本节将开始稍微深入的介绍一些进阶操作。本节将介绍数据库必须要知道的一个概念:数据库连接池(Connection Pool)
文章来源:http://www.flyml.net/2016/09/09/cassandra-tutorial-java-api-connection-pool/
数据库连接池的原理:
连接复用。通过建立一个数据库连接池以及一套连接使用、分配、管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。要知道,资源的申请、占用、释放都是非常消耗性能的操作。
常见的数据库都会支持这个特性~ 在MySQL/Oracle JDBC 之中,如果需要支持连接池,必须使用第三方的包,常见的如:DBCP,Druid,C3P0 等等。 而在Cassandra Java Driver 之中,天生就支持这个特性。
回忆一下,上一篇文章之中我们是如何连接上Cassandra数据库的:
Java
/**
* Initiates a connection to the cluster
* specified by the given contact point.
* 连接到指定的Cassandra节点。 该节点最好是Seeds server
*
* @param contactPoints the contact points to use. 连接点
* @param port the port to use. 端口,默认9042
*/
public void connect(String[] contactPoints, int port) {
cluster = Cluster.builder()
.addContactPoints(contactPoints).withPort(port)
.build();
System.out.printf("Connected to cluster: %s%n", cluster.getMetadata().getClusterName());
session = cluster.connect();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* Initiates a connection to the cluster
* specified by the given contact point.
* 连接到指定的Cassandra节点。 该节点最好是Seeds server
*
* @param contactPoints the contact points to use. 连接点
* @param port the port to use. 端口,默认9042
*/
publicvoidconnect(String[]contactPoints,intport){
cluster=Cluster.builder()
.addContactPoints(contactPoints).withPort(port)
.build();
System.out.printf("Connected to cluster: %s%n",cluster.getMetadata().getClusterName());
session=cluster.connect();
}
在此基础之上,我们增加数据库连接池进去:
Java
// 数据库连接池选项
PoolingOptions poolingOptions = new PoolingOptions();
cluster = Cluster.builder()
// 配置数据库连接池
.withPoolingOptions(poolingOptions)
.addContactPoints(contactPoints).withPort(port)
.build();
1
2
3
4
5
6
7
// 数据库连接池选项
PoolingOptionspoolingOptions=newPoolingOptions();
cluster=Cluster.builder()
// 配置数据库连接池
.withPoolingOptions(poolingOptions)
.addContactPoints(contactPoints).withPort(port)
.build();
注意上面的第2行与第5行。 实际上,Cassandra默认就启用了连接池的功能,只是没有显性的表示出来。比如我们可以用下面的代码获取连接池对象:
Java
PoolingOptions poolingOptions = cluster.getConfiguration().getPoolingOptions();
1
PoolingOptionspoolingOptions=cluster.getConfiguration().getPoolingOptions();
关于Cassandra之中数据库连接池的完整选项,可以参考官方说明
重要选项:并发连接数。 这个可以参考下面的代码:
Java
poolingOptions
.setCoreConnectionsPerHost(HostDistance.LOCAL, 4)
.setMaxConnectionsPerHost( HostDistance.LOCAL, 10)
.setCoreConnectionsPerHost(HostDistance.REMOTE, 2)
.setMaxConnectionsPerHost( HostDistance.REMOTE, 4);
1
2
3
4
5
poolingOptions
.setCoreConnectionsPerHost(HostDistance.LOCAL,4)
.setMaxConnectionsPerHost(HostDistance.LOCAL,10)
.setCoreConnectionsPerHost(HostDistance.REMOTE,2)
.setMaxConnectionsPerHost(HostDistance.REMOTE,4);
其中有一些概念需要说明一下:
HostDistance.LOCAL 与 HostDistance.REMOTE
当你只有一个DC的时候,设置Local即可
当你还有其他的DC需要连接,那么就需要设置Remote
setCoreConnectionsPerHost(HostDistance.LOCAL, 4)
表示和集群里的机器至少有2个连接。注意是和集群里的每个机器都至少有2个连接
.setMaxConnectionsPerHost( HostDistance.LOCAL, 10)
最多10个连接
其他的完整API 官方说明: click me (针对3.1 版本)
在调优Cassandra集群性能的时候,连接数是一个比较有用的设置。 根据不同的机器性能与业务压力,选择合适你自己场景的数值。在当前最新大版本(3.x) 之上, 默认数值为core=max=1。 也就是说,这个数值设置还是非常保守的! 如果你的机器性能不错,可以尝试将core 或者 max 加大。 并且当core != max 的时候, Cassandra会自动根据业务压力调整连接数的大小。
这一点有点见仁见智了。 就像Java的Heap Size。 在启动的时候也可以进行设置,但是很多场景之下,会设置min = max, 保证一开始就能占用到足够的资源。 对于DB来说,频繁的占用、释放资源,对性能损耗也不小。
文章来源:http://www.flyml.net/2016/09/09/cassandra-tutorial-java-api-connection-pool/
关于Cassandra性能测试,可以参考一篇博文:Cassandra性能测试
如果你觉得太长了,可以直接看他的结论:
SSD性能是好于传统机械硬盘,但提升的空间并没有预期的大
读性能受Compcation和Row Cache影响较大,对于读敏感的业务场景最好打开
读写同时进行时,读性能影响较大,即使Compaction和Row Cache已调整
Compcation对于读性能提升明显,但实际场景中不可能太频繁执行
写性能受影响较小,不管是硬盘介质还是数据整理方式
使用多线程可以线性提升整体的TPS,但写性能比读性能还是要好很多
尽量使用批量操作,可以减少网络IO开销,极大提升性能
Cassandra在写入上有极大的优势,并且在高并发下性能更好
文章来源:http://www.flyml.net/2016/09/09/cassandra-tutorial-java-api-connection-pool/
另外一个个人比较常用的设置:
Java
poolingOptions.setHeartbeatIntervalSeconds(60);
1
poolingOptions.setHeartbeatIntervalSeconds(60);
这个选项默认是开启的,默认30s。这个选项的作用是,当一个链接闲置了一段时间之后,client-side就会自动写一些无用的数据到DB(当然DB会自己处理)以保持连接还继续保持。
本文为原创文章,转载请注明出处