我正在尝试了解 Datastax Cassandra Driver 中的连接池,以便在我的网络服务中更好地使用它。
我有 1.0 版的文档。它说:
The Java driver uses connections asynchronously, so multiple requests can be submitted on the same connection at the same time.
他们通过联系了解什么?当连接到集群时,我们有:一个构建器、一个集群和一个 session 。其中哪一个是连接?
比如有这个参数:
maxSimultaneousRequestsPerConnection - number of simultaneous requests on all connections to a host after which more connections are created.
因此,在连接池的情况下(这是我所期望的),这些连接是自动创建的。但究竟有什么联系呢?集群对象? session ?
我正在尝试决定在我的网络服务中保持“静态”的内容。目前,我决定让 Builder 保持静态,因此对于每次调用,我都会创建一个新的 Cluster 和一个新的 Session。这个可以吗?如果Cluster是Connection,那应该没问题。但是吗?现在,记录器说,对于每次调用:
2013:12:06 12:05:50 DEBUG Cluster:742 - Starting new cluster with contact points
2013:12:06 12:05:50 DEBUG ControlConnection:216 - [Control connection] Refreshing node list and token map
2013:12:06 12:05:50 DEBUG ControlConnection:219 - [Control connection] Refreshing schema
2013:12:06 12:05:50 DEBUG ControlConnection:147 - [Control connection] Successfully connected to...
所以,它每次都连接到集群?这不是我想要的,我想重用连接。
那么,连接其实就是Session?如果是这种情况,我应该保持 Cluster 静态,而不是 Builder。
我应该调用什么方法,以确保尽可能重用连接?
最佳答案
accepted answer (在撰写本文时) 给出了正确的建议:
As long as you use the same Session object, you [will] be reusing connections.
但是,有些部分本来就过于简单了。我希望以下内容能让您深入了解每种对象类型的范围及其各自的用途。
构建器≠集群≠ session ≠连接≠语句
A Cluster.Builder
用于配置和创建集群
A Cluster
代表整个Cassandra 环
一个环由多个节点(主机)组成,环可以支持一个或多个键空间。您可以查询有关集群(环)级属性的集群对象。
我还认为它是表示调用应用程序 到环的对象。您已将应用程序的需求(例如加密、压缩等)传达给构建器,但首先实现/与实际 C* 环通信的是此对象。如果您的应用程序为不同的用户/目的使用多个身份验证凭据,您可能有不同的Cluster 对象,即使它们连接到同一个环。
A Session
本身不是连接,但它管理它们
session 可能需要与环中的所有 节点对话,这不能通过单个 TCP 连接来完成,除非环正好包含一 (1) 个节点的特殊情况。 Session 管理一个 connection pool ,并且该池通常为环中的每个节点至少有一个连接。 这就是为什么您应该尽可能多地重复使用Session 对象。应用程序不直接管理或访问连接。
Session 从 Cluster 对象访问;它通常一次“绑定(bind)”到一个键空间,成为从该 session 执行的语句 的默认键空间。语句可以使用完全限定的表名(例如 keyspacename.tablename
)来访问其他键空间中的表,因此不需要使用多个 session 来跨键空间访问数据.使用多个 session 与同一个环对话会增加所需的 TCP 连接总数。
A Statement
在 session
中执行
报表可以是prepared或不,并且每个都改变数据或查询它(在某些情况下,两者)。最快、最有效的语句最多需要与一个节点通信,并且来自拓扑感知集群的 session 应该只与该节点(或其对等节点之一)通信在单个 TCP 连接上。效率最低的语句必须触及所有副本(大多数节点),但这将由环本身上的协调器节点处理,因此即使对于这些语句, session 将仅使用来自应用程序的单个连接。
此外,驱动程序使用的 Cassandra 二进制协议(protocol)的第 2 版和第 3 版在连接上使用多路复用。因此,虽然单个语句需要至少一个 TCP 连接,但该单个连接可能同时服务多达 128 或 32k+ 个异步请求,具体取决于协议(protocol)版本(分别)。
关于java - Cassandra Datastax 驱动程序 - 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20421763/