node.js - query - node js mysql object
¿MongoDB ha vuelto a conectar problemas o lo estoy haciendo mal? (6)
Aumentar los tiempos de espera puede ayudar.
- "socketTimeoutMS": cuánto tiempo puede tardar un envío o recepción en un socket antes de que se agote el tiempo de espera.
- "wTimeoutMS": controla cuántos milisegundos espera el servidor para que se cumpla la preocupación de escritura.
"connectTimeoutMS": cuánto tiempo tarda una conexión en abrirse antes de que se agote el tiempo en milisegundos.
$ m = new MongoClient ("mongodb: //127.0.0.1: 27017", matriz ("connect" => TRUE, "connectTimeoutMS" => 10, "socketTimeoutMS" => 10, "wTimeoutMS" => 10));
$db= $m->mydb; $coll = $db->testData; $coll->insert($paramArr);
Estoy usando nodejs y un mongoDB, y tengo algunos problemas de conexión.
Bueno, en realidad "despierta" problemas! Se conecta perfectamente, es súper rápido y en general estoy contento con los resultados.
Mi problema: si no uso la conexión por un tiempo (digo que mientras, porque el marco de tiempo varía 5+ minutos) parece estancarse. No me disparan los eventos de desconexión, simplemente se cuelga.
Eventualmente recibo una respuesta como Error: no se pudo conectar a [* .mongolab.com: *] - (* = valores enmascarados)
Un reinicio rápido de la aplicación, y la conexión es genial de nuevo. Algunas veces, si no reinicio la aplicación, puedo actualizarla y reconectarme felizmente.
Es por eso que creo que son problemas de "despertar".
Esquema aproximado del código:
No he incluido el código, no creo que sea necesario. Funciona (aparte de la interrupción de la conexión)
Cosas a tener en cuenta: solo hay un "conectar": nunca lo cierro. Nunca vuelvo a abrir.
Estoy usando mangosta, socketio.
/* constants */
var mongoConnect = ''myworkingconnectionstring-includingDBname'';
/* includes */
/* settings */
/* Schema */
var db = mongoose.connect(mongoConnect);
/* Socketio */
io.configure(function (){
io.set(''authorization'', function (handshakeData, callback) {
});
});
io.sockets.on(''connection'', function (socket) {
});//sockets
io.sockets.on(''disconnect'', function(socket) {
console.log(''socket disconnection'')
});
/* The Routing */
app.post(''/login'', function(req, res){
});
app.get(''/invited'', function(req, res){
});
app.get(''/'', function(req, res){
});
app.get(''/logout'', function(req, res){
});
app.get(''/error'', function(req, res){
});
server.listen(port);
console.log(''Listening on port ''+port);
db.connection.on(''error'', function(err) {
console.log("DB connection Error: "+err);
});
db.connection.on(''open'', function() {
console.log("DB connected");
});
db.connection.on(''close'', function(str) {
console.log("DB disconnected: "+str);
});
He intentado varias configuraciones aquí, como abrir y cerrar todo el tiempo. Sin embargo, creo que el consenso general es hacer lo que yo hago con un producto abierto. ??
He probado un probador de conexión, que sigue verificando el estado de la conexión ... aunque esto parece decir que todo está bien, el problema aún ocurre.
He tenido este problema desde el primer día. Siempre he alojado el MongoDB con MongoLab. El problema parece ser peor en localhost. Pero todavía tengo el problema en Azure y ahora nodejit.su.
Como sucede en todas partes, debo ser yo, MongoDB o mongolab.
Por cierto, he tenido una experiencia similar con el controlador de php también. (para confirmar que esto está en nodejs)
Sería genial para algo de ayuda, incluso si alguien simplemente dice "esto es normal"
gracias por adelantado
Robar
Gracias por toda la ayuda chicos. He logrado resolver este problema tanto en localhost como desplegado en un servidor en vivo.
Aquí está mi código de conexión que ahora funciona:
var MONGO = {
username: "username",
password: "pa55W0rd!",
server: ''******.mongolab.com'',
port: ''*****'',
db: ''dbname'',
connectionString: function(){
return ''mongodb://''+this.username+'':''+this.password+''@''+this.server+'':''+this.port+''/''+this.db;
},
options: {
server:{
auto_reconnect: true,
socketOptions:{
connectTimeoutMS:3600000,
keepAlive:3600000,
socketTimeoutMS:3600000
}
}
}
};
var db = mongoose.createConnection(MONGO.connectionString(), MONGO.options);
db.on(''error'', function(err) {
console.log("DB connection Error: "+err);
});
db.on(''open'', function() {
console.log("DB connected");
});
db.on(''close'', function(str) {
console.log("DB disconnected: "+str);
});
Creo que el mayor cambio fue usar "createConnection" sobre "connect": ya había usado esto antes, pero tal vez las opciones ahora son útiles. Este artículo ayudó mucho http://journal.michaelahlers.org/2012/12/building-with-nodejs-persistence.html
Si soy sincero, no estoy muy seguro de por qué he agregado esas opciones, como menciona @jareed, también encontré que algunas personas tuvieron éxito con "MaxConnectionIdleTime", pero hasta donde puedo ver, el controlador javascript no lo hace. tener esta opción: este fue mi intento de tratar de replicar el comportamiento.
Hasta aquí todo bien, espero que esto ayude a alguien.
ACTUALIZACIÓN: nota del 18 de abril de 2013 , esta es una segunda aplicación con una configuración diferente
Ahora pensé que lo había resuelto, pero el problema volvió a ser feo en otra aplicación recientemente, con el mismo código de conexión. ¡¡¡Confuso!!!
Sin embargo, la configuración fue ligeramente diferente ...
Esta nueva aplicación se ejecutaba en un cuadro de Windows utilizando IISNode. No vi esto como significativo inicialmente.
Leí que posiblemente había algunos problemas con Mongo en Azure (@jareed), así que moví el DB a AWS, pero el problema persistía.
Así que comencé a jugar de nuevo con ese objeto de opciones, leyendo mucho sobre él. Llegué a esta conclusión:
options: {
server:{
auto_reconnect: true,
poolSize: 10,
socketOptions:{
keepAlive: 1
}
},
db: {
numberOfRetries: 10,
retryMiliSeconds: 1000
}
}
Eso fue un poco más educado que mi objeto de opciones original que declaro. Sin embargo, todavía no es bueno.
Ahora, por alguna razón tuve que salir de ese cuadro de Windows (algo que tiene que ver con un módulo que no compila) - era más fácil moverse que pasar otra semana tratando de hacerlo funcionar.
Así que moví mi aplicación a nodejitsu. Bajo y ¡mi conexión se mantuvo viva! ¡Cortejar!
Asi que…. ¿Qué significa esto ... No tengo idea! Lo que sí sé es que esas opciones parecen funcionar en Nodejitsu ... para mi.
Creo que IISNode usa algún tipo de script "para siempre" para mantener la aplicación viva. Ahora, para ser justos, la aplicación no falla para que esto suceda, pero creo que debe haber algún tipo de "ciclo de la aplicación" que se renueve constantemente: así es como puede hacer una implementación continua (código FTP, no es necesario reiniciar la aplicación) - tal vez este es un factor; pero solo estoy adivinando ahora.
Por supuesto, todo esto significa ahora, esto no está resuelto. Todavía no está resuelto. Es solo solucionado para mí en mi configuración.
Habilite la opción Server
auto_reconnect
esta manera:
var db = mongoose.connect(mongoConnect, {server: {auto_reconnect: true}});
La conexión que estás abriendo aquí es en realidad un grupo de 5 conexiones (por defecto), así que tienes derecho a conectarte y dejarla abierta. Supongo que pierdes conectividad intermitentemente con mongolab y tus conexiones mueren cuando eso ocurre. Con suerte, habilitar la auto_reconnect
resuelve eso.
Tenía un problema similar desconectado de MongoDB periódicamente . Hacer dos cosas lo solucionó:
- Asegúrese de que su computadora nunca duerma (eso matará su conexión de red).
- Omita su enrutador / cortafuegos (o configúrelo correctamente, lo cual no he descubierto aún cómo hacerlo).
Un par de recomendaciones para las personas que todavía tienen este problema:
Asegúrese de estar utilizando el último cliente de mongodb para node.js. Noté mejoras significativas en esta área al migrar de v1.2.x a v1.3.10 (la última a partir de hoy)
Puede pasar un objeto de opciones al MongoClient.connect. Las siguientes opciones me funcionaron cuando me conecté de Azure a MongoLab:
options = {db: {}, servidor: {auto_reconnect: true, socketOptions: {keepAlive: 1}}, replSet: {}, mongos: {}};
MongoClient.connect (dbUrl, options, function (err, dbConn) {// tu código});
Vea esta otra respuesta en la que describo cómo manejar el evento ''cerrar'' que parece ser más confiable. https://.com/a/20690008/446681
ACTUALIZACIÓN : Nuestro artículo de soporte para este tema (esencialmente una copia de esta publicación) se ha trasladado a nuestro documento de solución de problemas de conexión .
Existe un problema conocido que la red Azure IaaS impone un tiempo de inactividad de aproximadamente trece minutos (empíricamente alcanzado). Estamos trabajando con Azure para ver si no podemos hacer las cosas más fáciles de usar, pero mientras tanto, otros han tenido éxito al configurar sus opciones de controlador para evitar el problema.
Tiempo máximo de inactividad de la conexión
La solución más efectiva que hemos encontrado al trabajar con Azure y nuestros clientes ha sido establecer el tiempo máximo de inactividad de la conexión por debajo de cuatro minutos. La idea es hacer que el controlador recicle las conexiones inactivas antes de que el firewall fuerce el problema. Por ejemplo, un cliente, que está usando el controlador C #, estableció MongoDefaults.MaxConnectionIdleTime
en un minuto y solucionó sus problemas.
MongoDefaults.MaxConnectionIdleTime = TimeSpan.FromMinutes(1);
El código de la aplicación en sí no cambió, pero ahora detrás de las escenas el conductor recicla agresivamente las conexiones inactivas. El resultado también se puede ver en los registros del servidor: una gran cantidad de conexiones se agrietan durante los períodos de inactividad en la aplicación.
Hay más detalles sobre este enfoque en el subproceso de mongo-usuario relacionado, SocketException que utiliza el controlador C # en azul .
Mantener viva
También puede solucionar el problema haciendo que sus conexiones estén menos inactivas con algún tipo de keepalive . Esto es un poco complicado de implementar a menos que su controlador lo admita de la caja, generalmente aprovechando TCP Keepalive . Si necesita rodar el suyo, asegúrese de tomar cada conexión inactiva de la piscina cada dos minutos y emita un comando simple y económico, probablemente un ping .
Manejo de desconexiones
Las desconexiones pueden ocurrir de vez en cuando, incluso sin una configuración agresiva de firewall. Antes de entrar en producción, debe asegurarse de manejarlos correctamente.
Primero, asegúrese de habilitar la reconexión automática. La forma de hacerlo varía de un controlador a otro, pero cuando el controlador detecta que una operación falló porque la conexión estaba mal, la reconexión automática le dice al conductor que intente reconectarse.
Pero esto no resuelve completamente el problema. Aún tiene el problema de qué hacer con la operación fallida que activó la reconexión. La reconexión automática no reintenta automáticamente las operaciones fallidas. Eso sería peligroso, especialmente para escrituras. Por lo general, se lanza una excepción y se solicita a la aplicación que la maneje. A menudo, reintentar leer es una obviedad. Pero reintentar escrituras debe ser considerado cuidadosamente.
La sesión de mongo shell a continuación demuestra el problema. El shell mongo de forma predeterminada tiene habilitada la reconexión automática. Inserto un documento en una colección llamada stuff
luego encuentro todos los documentos en esa colección. Luego configuré un temporizador durante treinta minutos y probé el mismo hallazgo nuevamente. Falló, pero el caparazón se volvió a conectar automáticamente y cuando intenté de nuevo mi búsqueda, funcionó como se esperaba.
% mongo ds012345.mongolab.com:12345/mydatabase -u *** -p ***
MongoDB shell version: 2.2.2
connecting to: ds012345.mongolab.com:12345/mydatabase
> db.stuff.insert({})
> db.stuff.find()
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }
> db.stuff.find()
Fri Jan 18 13:29:28 Socket recv() errno:60 Operation timed out 192.168.1.111:12345
Fri Jan 18 13:29:28 SocketException: remote: 192.168.1.111:12345 error: 9001 socket exception [1] server [192.168.1.111:12345]
Fri Jan 18 13:29:28 DBClientCursor::init call() failed
Fri Jan 18 13:29:28 query failed : mydatabase.stuff {} to: ds012345.mongolab.com:12345
Error: error doing query: failed
Fri Jan 18 13:29:28 trying reconnect to ds012345.mongolab.com:12345
Fri Jan 18 13:29:28 reconnect ds012345.mongolab.com:12345 ok
> db.stuff.find()
{ "_id" : ObjectId("50f9b77c27b2e67041fd2245") }
Estamos aquí para ayudar
Por supuesto, si tiene alguna pregunta, no dude en ponerse en contacto con nosotros en [email protected]. Estamos aquí para ayudar.