java cassandra连接池_[Cassandra教程] (七)Java API 进阶 - 数据库连接池

上一篇文章《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会自己处理)以保持连接还继续保持。

本文为原创文章,转载请注明出处

17f038aad41ce6034948937eb6fcaaf8.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值