当前位置: 首页 > 面试题库 >

gopkg.in/mgo.v2中的并发(Mongo,Go)

空鸿云
2023-03-14
问题内容

我希望在用Go编写的webapp中使用MongoDB。

我可以mgo.Session同时在Web应用程序中使用它吗?例如在http.Handler

或者我应该叫Session.CopySession.Close- >会议的化妆池。

在我读到某个池已经在其中实现mgo.Session,我可以同时使用会话以及在其他地方读到我需要Copy和的地方,这听起来很矛盾Close


问题答案:

mgo.Session是同时使用安全。引用其文档:

所有Session方法都是并发安全的,可以从多个goroutine中调用。

但这并不意味着您不应该通过在拨号时获得的初始会话上调用Session.Copy()或来并行创建和使用更多它们Session.Clone()

并发安全并从中使用更多好处不会 彼此排斥 (它们不是 互斥的
)。虽然你可以使用一个单一mgo.Session的够程的任意数,不会很好地扩展,将无法形成规模 ,在所有
。会话会自动管理一个连接池,甚至可能管理到多个服务器节点的连接,但是如果您使用的是单个Session,则不会利用这一点。通过Session在每个请求的开始处创建一个新请求(如果需要),并在结束时适当关闭它(使用Session.Close();最好使用来调用defer),您正在利用可能同时使用多个连接(可能与多个服务器节点(如果有)的连接)的优势,从而更好地利用服务器资源;并获得更快的响应时间(从数据库,最终到HTTP最终用户)。调用Session.Close()不会关闭与服务器的基础连接,它只会将连接放回池中,以供其他会话使用。



 类似资料:
  • 问题内容: 我正在寻找一种方便的方法来检查对象是否已经存在于集合中。目前,我发现的唯一方法是 我不想创建变量res,以防万一对象存在,它可能是非常繁重的文档,包含很多字段。我希望会有另一种方式,一些Check()函数将仅返回bool值。基本上,我只需要知道对象已经存储在collection中,就不需要它自己 问题答案: 您必须使用$ exists 语法:{栏位:{$ exists:}} 更多细节

  • 问题内容: 我试图实现使用中去(golang)我的MongoDB查询的一个功能氧化镁包。 以下是我的收藏: 资料夹: 文件: 以下是我编写的在外壳程序上成功运行的查询: 如果我在外壳上运行此脚本,则会得到所需的结果。基本上,集合会返回给我,其中包含通过链接的全部相关内容。我不在这里包括它,因为这个问题似乎已经太久了。 我试图将此查询转换为 mgo 能够解析和执行的内容。在下面的go代码中: 我总是

  • 问题内容: 我正在尝试从https://github.com/go-yaml/yaml导入go- yaml,但看到Google无法帮助的错误。 我运行了,但是却遇到了错误:尝试运行程序时。我也不会在导入中做任何异国情调的操作: 任何帮助,将不胜感激! 问题答案: Go有两个必须在os环境中定义的路径,即GoRoot和GoPath,GoRoot是Go的安装路径,其中只有“标准软件包”。GoPath是

  • 问题内容: 我正在使用CentOS7;尝试下载golang 1.5.1二进制文件和,并遇到了安装revel的相同问题。去工作正常;当我这样做时,它将显示正确的版本。 当我输入时,一些软件包下载就很好了。…直到它被fsnotify为止。然后我得到以下输出: 它只是冻结。不管我尝试什么,它都不会下载任何内容。在文件中,并在就好拉。我已经确保可以使用http://gopkg.in和https://gop

  • 我有像下面这样的节点服务器。并且我几乎同时推送2个请求(使用相同的url=“localhost:8080/”)。我的问题是:“为什么服务器等待第一个请求处理完成,然后将处理第二个请求”? 我的测试控制台中的输出: (注意:第2行将在12second后显示)-server.js:

  • 我有一个关于JMeter中并发性和恒定吞吐量的查询。你能帮我做这个吗? 假设我有一个简单的JMeter脚本来测试RESTAPI(get),不同的JMeter参数设置如下。 恒定吞吐量定时器 假设:Api立即响应,没有任何延迟。 问题 我对JMeter的理解如下:如果我执行脚本,那么JMeter将并发触发5个请求(因为线程数设置为5),然后JMeter将等待一分钟(因为吞吐量设置为5个/分钟和JMe