2012-04-17 19 views
9

Estoy intentando crear una aplicación pequeña con Sinatra y ActiveRecord (3.2.3).Advertencia de conexión de ActiveRecord. (Las conexiones a la base de datos no se cerrarán automáticamente)

Así es como mi archivo principal se parece a:

require "sinatra" 
require "sinatra/reloader" 
require "active_record" 
... 

ActiveRecord::Base.establish_connection(
    adapter: 'sqlite3', 
    database: 'db.sqlite3', 
    host:  'localhost', 
) 

class Post < ActiveRecord::Base 
    ... 
end 

get('/') { ... } 
get('/posts') { ... } 
... 

Funciona, pero a veces me da una advertencia en la consola:

Deprecation ADVERTENCIA: Las conexiones de base de datos no se cerrarán de forma automática, cierre su conexión de base de datos al final del hilo llamando al close en su conexión. Por ejemplo: ActiveRecord :: Base.connection.close'

Cuando se produce la advertencia es tarda mucho tiempo antes de que se actualice la página. No entiendo dónde debo cerrar la conexión. Intenté poner ActiveRecord::Base.connection.close en la parte inferior del archivo, pero no ayuda.

actualización:

me olvidó mencionar que también utilizo el plugin Sinatra/recargador de sinatra-contrib joya para mirar a efecto sin necesidad de reiniciar el servidor.

require "sinatra/reloader" 

Si lo comento, el problema desaparece. Pero de todos modos, me pregunto cómo deshacerse del problema sin deshabilitar el recargador.

Respuesta

13

Necesita agregar un middleware a su pila. Sólo añadir esta línea a su config.ru acumular archivo:

use ActiveRecord::ConnectionAdapters::ConnectionManagement 

encontrado la respuesta aquí: https://github.com/puma/puma/issues/59

+0

Impresionante. Gracias –

13

La respuesta aceptada no funcionó para mí en Sinatra en fina (modo de rosca). En lugar de ello he utilizado:

after do 
    ActiveRecord::Base.connection.close 
end 
+0

Encontré lo mismo para mí. Alguien sabe por qué este es el caso? Para las personas que lograron que esto funcione, ¿qué estabas usando para un servidor? – PICyourBrain

+0

Intenté esto pero aún no funciona para mí. – jamesfzhang

+0

Esta respuesta funcionó en una aplicación sinatra con un db_pool de 10 ejecutándose en puma. –

1
ActiveRecord::Base.remove_connection 

funciona bien para mí y figura en la documentación.

+0

¿Dónde en los documentos? ¿Dónde deberían usar este código? – Adam

+1

¡Bienvenido a StackOverflow! Esto no califica como una respuesta y probablemente debería ser un comentario. –

+0

@Adam http://www.rubydoc.info/gems/activerecord/5.1.0/ActiveRecord/ConnectionHandling#remove_connection-instance_method - se debe llamar al método cuando la base de datos ya no es necesaria. – ryu

Cuestiones relacionadas