golang - mgo mongodb driver
Concurrencia en gopkg.in/mgo.v2(Mongo, Go) (2)
Deseo usar MongoDB en la aplicación web escrita en Go.
¿Puedo tener una mgo.Session
y usarla al mismo tiempo en la aplicación web? por ejemplo, en http.Handler
o debería llamar a Session.Copy
y Session.Close
-> make pool of sessions.
Suena contradictorio en algún lugar que he leído que el grupo ya está implementado dentro de mgo.Session
y puedo usar la sesión al mismo tiempo y en otros lugares leo que necesito Copy
y Close
.
Llamar Dial
o DialWithTimeout
o DialWithInfo
establecerá el grupo de conexiones. Si necesita más de una sesión, debe llamar a session.Copy () o session.New (), session.Copy () es preferible ya que conservará la autenticación. Aquí hay un ejemplo:
Digamos que tiene una estructura UserService
para manejar todas las necesidades de db de su usuario. Tenga en cuenta que esto es muy difícil, por lo que podría haber algunos errores de sintaxis, pero la idea está allí.
type Userservice struct {
DB *mgo.Session
}
func (s *Userservice) Create(u *User) error {
sessionCopy := s.DB.Copy()
defer sessionCopy.Close()
db := sessionCopy.DB("test_db")
col := db.C("users")
if err := col.Insert(u); err != nil {
return err
}
}
El mgo.Session
es seguro para uso concurrente. Citando de su documento:
Todos los métodos de sesión son seguros para la concurrencia y se pueden invocar desde múltiples goroutines.
Pero esto no significa que no deba crear y usar más de ellos en paralelo, llamando a Session.Copy()
o Session.Clone()
, en la sesión inicial obtenida en el momento del marcado.
Siendo seguros para la concurrencia y teniendo el beneficio de usar más de ellos no se excluyen mutuamente (no son mutuamente excluyentes ). Si bien puedes usar una sola mgo.Session
de mgo.Session
desde un número arbitrario de goroutines, eso no se escalará bien, eso no se escalará en absoluto . Las sesiones administran automáticamente un conjunto de conexiones, tal vez incluso a varios nodos de servidor, pero si está utilizando una única Session
, no se está aprovechando de eso. Al crear una nueva Session
al inicio de cada una de sus solicitudes (si es necesario) y al cerrarla correctamente al final (con Session.Close()
, preferiblemente llamado con defer
), está aprovechando la posibilidad de utilizar múltiples conexiones en el al mismo tiempo, posiblemente a varios nodos de servidor (si están disponibles), y así utilizar mejor los recursos del servidor; y obtener tiempos de respuesta más rápidos (tanto desde la base de datos como, en última instancia, hasta sus usuarios finales HTTP). Al llamar a Session.Close()
no se cierra la conexión subyacente al servidor, simplemente se vuelve a poner la conexión en el grupo, lista para que otra sesión la recoja.
También vea la pregunta relacionada sobre el uso de Session
s: mgo: el rendimiento de la consulta parece ser constantemente lento (500-650 ms)