我试图理解Datastax Cassandra驱动程序中的连池,因此我可以更好地在我的Web服务中使用它。
我有留档的1.0版。它说:
Java驱动程序异步使用连接,因此可以在同一个连接上同时提交多个请求。
他们通过连接理解什么?当连接到集群时,我们有:一个生成器、一个集群和一个会话。他们中的哪一个是连接?
例如,有一个参数:
MaxSimultaneousRecestsPerConnection-主机的所有连接上同时请求的数量,之后将创建更多的连接。
因此,在连接池的情况下,这些连接是自动创建的(这是我所期望的)。但具体的联系是什么?群集对象?会议?
我试图决定在我的网络服务中保持什么“静态”。目前,我决定保持生成器静态,所以对于每一个调用,我都创建一个新的集群和新的会话。这样可以吗?如果集群是连接,那么它应该可以。但是是吗?现在,记录器说,对于每一个调用:
2013:12:06 12:05:50DEBUG群集:742-使用接触点启动新群集
2013:12:06 12:05:50调试控制连接:216-[Control connection]刷新节点列表和令牌映射
2013:12:06 12:05:50调试控制连接:219-[Control connection]刷新模式
2013:12:06 12:05:50调试控制连接:147-[Control connection]已成功连接到。。。
那么,它每次都连接到集群?这不是我想要的,我想要重用连接。
那么,连接实际上就是会话?如果是这种情况,我应该保持集群静态,而不是构建器。
如果可能,我应该调用什么方法来确保重用连接?
只是社区的更新。您可以通过以下方式设置连接池
private static Cluster cluster;
cluster.getConfiguration().getPoolingOptions().setMaxConnectionsPerHost(HostDistance.LOCAL,100);
你是对的,连接实际上在会话中,会话是你应该给DAO的对象,以便写入Cassandra。
只要使用相同的会话对象,就应该重用连接(可以将会话视为连接池)。
编辑(2017/4/10):我在@William Price one之后对这个答案进行了提炼。请注意,这个答案已经有4年历史了,同时卡桑德拉也发生了相当大的变化!
被接受的答案(在撰写本文时)给出了正确的建议:
只要使用相同的会话对象,就可以重用连接。
然而,有些部分原本过于简单。我希望以下内容能够深入了解每种对象类型的范围及其各自的用途。
一个环由多个节点(主机)组成,环可以支持一个或多个键空间。可以查询群集对象有关群集-(环)级别属性的信息。
我还将其视为表示环的调用应用程序的对象。您将应用程序的需求(例如加密、压缩等)传达给了构建器,但正是这个对象首先实现了实际的C*环。如果您的应用程序为不同的用户/目的使用多个身份验证凭据,那么即使它们连接到同一个环,也可能有不同的群集对象。
一个会话可能需要与环中的所有节点通话,这不能通过单个TCP连接完成,除非环中只包含一(1)个节点。会话管理一个连接池,该池通常对环中的每个节点至少有一个连接。这就是为什么您应该尽可能多地重用会话对象。应用程序不会直接管理或访问连接。
从集群对象访问会话;它通常一次“绑定”到一个键空间,该键空间成为从该会话执行的语句的默认键空间。语句可以使用完全限定的表名(例如,keyspacename.tablename
)来访问其他键空间中的表,因此不需要使用多个会话来跨键空间访问数据。使用多个会话与同一个环通话会增加所需的TCP连接总数。
语句可以准备,也可以不准备,每个语句要么修改数据,要么查询数据(在某些情况下,两者都可以)。最快、最高效的语句最多需要与一个节点通信,而拓扑感知集群中的会话应在单个TCP连接上仅与该节点(或其对等节点之一)联系。效率最低的语句必须接触所有副本(大多数节点),但这将由环上的协调器节点自己处理,因此即使对于这些语句,会话也将只使用来自应用程序的单个连接。
此外,驱动程序使用的Cassandra二进制协议的版本2和版本3在连接上使用多路复用。因此,尽管一条语句至少需要一个传输控制协议,但根据协议版本,该单个连接可能同时服务多达128或32k个异步请求。
问题内容: 我目前正在为大学的一个班级做项目。我正在学习有关连接和操作数据库的信息,我们正在使用Microsoft .accdb文件。 这是我到目前为止所拥有的。 当寻找“ sun.jdbc.odbc.JdbcOdbcDriver”时,我得到以下输出。 似乎很容易解决。看来我想念司机或类似的东西。但是,我很难找到解决方法。JDK随附驱动程序吗?我需要单独下载吗?是否取决于我的操作系统?(Mac O
我的java代码使用com.mongodb.DB的单个实例连接到mongo DB。现在我使用这个db实例跨越500个线程,这些线程对我的db执行命令。所有这些都并行运行。以下是conf参数: 现在,如果我使用“db.serverStatus().connections”检查我的数据库,我会得到以下结果:“current”:52,“available”:19999,“totalCreated”:Nu
这是我在运行上述程序时遇到的错误。有人解决了这个问题吗? 我尝试过改变Selenium和ChromeDriver的版本,但没有任何效果。
我在向Pentaho数据集成添加MSSQL SERVER连接时遇到问题。 我尝试了以下方法: 我已经下载了最新的jdbc驱动程序(sqljdbc42)并将它们移动到lib文件夹 我在SQL SERVER中创建了一个新用户,并授予了它所有权限...没有帮助。 非常确定用户名/密码和登录设置 多次重新安装Pentaho,重新安装JDBC驱动程序 我有一台Mac,但在平行上使用Windows,我在这个环
问题内容: 在进行简单的JDBC连接时,所有资源都提供相同的代码, 但是我们实际上与“ Class.forName(driver)”无关。我们没有将其存储在任何地方。它的用途是什么,因为我们与Class.forName(driver)的返回无关。 问题答案: 尝试加载命名的类。在早期的JDBC版本中,这是必需的,因为该类要求以这种方式加载该类。多年以来都不需要这样做。 忽略通话,不会发生任何不良情
我们有一个复制设置,其中主节点,辅助节点和仲裁节点运行mongodb社区服务器v3.4.16。 我们正在使用jasperserver从mongoDB数据库生成100个报告。 最近,我们在连接到mongodb服务器时开始面临连接重置问题,因为报告会随机失败。 应用程序(jasperserver)和mongodb在同一个网络中,它们之间没有防火墙。 有人能提供任何指导来进一步调查根本原因,以便解决问题