乐闻世界logo
搜索文章和话题

Elasticsearch 中 connect 与 createconnection 的区别是什么?

7 个月前提问
3 个月前修改
浏览次数36

2个答案

1
2

Elasticsearch 中的 connectcreateConnection 并非是 Elasticsearch 官方提供的 API 或函数,这两个词可能是在特定的上下文或库中使用的,比如说某些客户端库可能会提供这样的方法来管理与 Elasticsearch 集群的连接。

假设您提到的是某个特定的 Elasticsearch 客户端库,那么通常:

  • connect 方法可能用于建立与 Elasticsearch 集群的连接。它可能是一个简便方法,用于连接到集群并确认连接是活跃的。这个方法可能不需要太多参数,或者它可能会使用一些默认的配置。

  • createConnection 方法可能更加灵活,允许开发者指定更多的配置选项,比如连接的地址、端口、使用的协议、认证信息等。createConnection 方法可能会返回一个连接实例,该实例可以用于后续的操作和查询。

举个例子,如果我们使用的是 Node.js 的 Elasticsearch 客户端,我们可能会这样使用这两个方法(以伪代码为例):

javascript
// 假设这是一个假想的Elasticsearch客户端库 const esClient = require('elasticsearch-client'); // 使用connect方法简单地连接到Elasticsearch集群 esClient.connect('http://localhost:9200'); // 使用createConnection创建一个带有详细配置的连接 const connection = esClient.createConnection({ host: 'http://localhost:9200', log: 'trace', auth: { username: 'user', password: 'pass' } });

在实际的 Elasticsearch 客户端中,例如官方提供的 elasticsearch.js 或者新的 @elastic/elasticsearch,您通常直接在客户端实例化时传递配置参数,而不会有单独的 connectcreateConnection 方法。如下所示:

javascript
const { Client } = require('@elastic/elasticsearch'); const client = new Client({ node: 'http://localhost:9200', auth: { username: 'user', password: 'pass' } });

在上面的官方客户端代码示例中,您只需创建一个 Client 实例,并通过构造函数传递配置参数来连接 Elasticsearch 集群。

因此,为了提供准确的答案,我需要知道具体是哪个客户端库或应用程序中的 connectcreateConnection。如果你能提供更多的上下文或详细信息,我将能够给出更加具体的答案。

2024年6月29日 12:07 回复

我对官方文档的理解是,通常当只有一个连接时使用 mongoose.connect() ,而如果有多个连接实例则使用 mongoose.createConnection() 。

是的。确切地说,.connect()实际上创建了一个保持打开状态的套接字/连接池(在poolSize连接设置中定义,默认值为 5),因此实际上有多个连接,但在单个池中。话虽如此,如果您想要多个具有不同属性的连接池,您应该使用createConnection

另外,如果我的理解是正确的,那么在单连接中使用 mongoose.createConnection() 有什么缺点?为什么不建议我们在每种情况下都使用 mongoose.createConnection() 来标准化连接?

这是一个很好的问题,文档中也已经有答案:

当您调用 mongoose.connect() 时,Mongoose 会创建一个默认连接。您可以使用 mongoose.connection 访问默认连接。

基本上.connect是一组(大部分)最佳实践设置的简写createConnection

在大多数简单的项目中,您不必担心指定不同的读取或写入设置、池大小、与不同副本服务器的单独连接等,这就是.connect存在的原因。

但是,如果您有更苛刻的要求(例如出于法律或性能原因),您可能必须使用createConnection.

几周前,我遇到了一种情况,我的一个(内部)统计包需要零星但大负载的数据库访问。由于我不想将 db/mongoose 对象传递给包以使其尽可能模块化,因此我只是创建了一个新连接。这非常有效,因为我只需要访问我在包中定义的某个模型,而不是我的“父”包中定义的模型。由于新包只需要读取访问,并且可以从不同的从属/副本数据库读取以减少主数据库的负载,因此我切换到两端的 createConnection 以将连接与主数据库分开。

对我来说,在同一模块中创建多个连接的一大缺点是,如果模型是在不同的连接中定义的,则您无法通过 直接访问模型mongoose.model。该答案详细说明了该问题:https://stackoverflow.com/a/22838614/2856218

2024年6月29日 12:07 回复

你的答案