A
mgo.Session
é seguro para uso simultâneo. Citando seu doc:
Todos os métodos Session são seguros de simultaneidade e podem ser chamados de várias goroutines.
Mas isso não significa que você não deva criar e usar mais deles em paralelo, chamando
Session.Copy()
ou Session.Clone()
, na sessão inicial obtida no tempo de discagem. Ser seguro de simultaneidade e ter o benefício de usar mais deles não excluem uns aos outros (eles não são mutuamente exclusivos ). Embora você possa usar um único
mgo.Session
a partir de um número arbitrário de goroutines, que não serão dimensionadas bem, que não serão de forma alguma . As sessões gerenciam automaticamente um pool de conexões, talvez até mesmo para vários nós de servidor, mas se você estiver usando uma única Session
, você não está aproveitando isso. Ao criar uma nova Session
no início de cada solicitação (se necessário) e fechando-a corretamente no final (com Session.Close()
; preferencialmente chamado usando defer
), você está aproveitando potencialmente o uso de várias conexões ao mesmo tempo, possivelmente para vários nós de servidor (se disponíveis) e, portanto, utilizando melhor os recursos do servidor; e obter tempos de resposta mais rápidos (tanto do banco de dados quanto para seus usuários finais HTTP). Chamando Session.Close()
não fecha a conexão subjacente ao servidor, ele apenas coloca a conexão de volta ao pool, pronta para ser captada por outra sessão. Veja também a pergunta relacionada sobre o uso de
Session
s:mgo - o desempenho da consulta parece consistentemente lento (500-650ms)