Como arriba realmente.¿Cómo se cambia la cadena de conexión de NHibernate por solicitud HTTP?
Respuesta
Un ISessionFactory.OpenSession() se puede suministrar con una IDbConnection.
Otra opción es implementar un IConnectionProvider que cree las instancias de IDbConnection apropiadas dependiendo de alguna condición (que tiene que ser global, por lo que esta solución no está muy limpia).
Exactamente lo que quería, simple y hace lo que dice en la lata. –
Tenga en cuenta que la conexión debe ser abierta antes de usarla. NHibernate no lo hará por usted (Acabo de enterarme). – nickd
El IConnectionProvider depende en una condición global es problemático. Me gustaría que hubiera alguna manera de pasar los datos de configuración al proveedor cuando se crea la sesión. –
Bueno, puede ser difícil pero y creo que no se debe hacer, pero aquí está la idea:
var cfg = new Configuration(); // Get a new NHibernate Configuration
cfg.SetProperty("connection.connection_string", yourConnectionString); // Alter the property
cfg.Configure(); // Configure with this configuration
var sf = cfg.BuildSessionFactory(); // Get a new ISessionFactory
No sé si este es el mejor método, pero puede funcionar. Se podría así tener archivos XML de configuración 2 y hacer esto:
var cfg = new Configuration("hibernate1.cfg.xml"); // OR
var cfg = new Configuration("hibernate2.cfg.xml");
En respuesta a los comentarios, puede tener varias fábricas de sesión inicializados y listos para su uso, pero eso no es exactamente "cambiar la cadena de conexión". Luego elige el que necesitas. La parte costosa es crear el objeto Configuración y llamar a Configurar().
También existe la biblioteca NHibernate Burrow, que gestiona varias sesiones al mismo tiempo y elige la correcta dependiendo de la entidad.
var session = new BurrowFramework().GetSession(); // default session
var session = new BurrowFramework().GetSession(typeof(Entity)); // session that manages Entity class
Gracias Marc, sin embargo, pensé que SessionFactory solo debería crearse una sola vez porque es un procedimiento costoso ? –
Cambié mi respuesta para completarla. Como dijo @ joshua.ewer, Burrow puede ayudar. De todos modos, evite crear fábricas de sesión más de una vez por configuración. –
La SessionFactory es lo que configura sus conexiones, dialectos, etc., por lo que si desea cambiar la cadena de conexión, tendrá que volver a configurar. Pero, sí, tu comentario es correcto. Configurar una fábrica de sesiones es una de las operaciones más caras, por lo que solo quiere hacerlo cuando lo necesite y nunca más.
Hay algunos conceptos de conversación realmente geniales en nHibernate Burrow. Si observa cómo están administrando la sesión, puede encontrar algunas ideas creativas para administrar múltiples sesiones en múltiples bases de datos.
Tengo la sugerencia de que lo mismo que el principio de @ Marc: puede encapsular las conexiones dinámicas en un proveedor. Eche un vistazo al nhibernate.info wiki regarding dynamic connection providers. Puede crear fácilmente un proveedor en el que transfiera la información que necesita para crear una sesión que apunte a la base de datos que desea.
estoy usando NHibernate 2.0 en la parte superior de más de 100 bases de datos (todos tienen mismo esquema, pero los datos físicamente separados) por lo que definitivamente se puede hacer con un poco de TLC ;-)
Configurar una ISession es en realidad extremadamente barato. Lo * que * es caro es la creación de ISessionFactory. –
Estaba respondiendo al comentario/pregunta de @marc de "SessionFactory solo debe crearse una vez", pero después de ver mi respuesta, mi redacción implica que Session es la cara. ;-( –
Tenga en cuenta que al suministrar IDbConnection
a OpenSession()
, no podrá utilizar la memoria caché de segundo nivel.
Ver https://forum.hibernate.org/viewtopic.php?f=25&t=959178
... "Esto no es un error. Si está administrando sus propias conexiones, NHibernate desactiva el uso de la caché de segundo nivel para la sesión para estar seguro." .. .
Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas solo de enlace pueden dejar de ser válidas si la página vinculada cambia – Marusyk
- 1. Fluido NHibernate ExportSchema sin cadena de conexión
- 2. ServiceStack NHibernate Sesión por solicitud
- 3. Por qué la solicitud de Http con Fiddler es increíble
- 4. Erlang. Solicitud HTTP asíncrona. ¿Cómo saber cuándo se rompe la conexión?
- 5. ¿Cómo la cadena de conexión protegida por la aplicación Yii?
- 6. Node.js HTTP/NET - Diferencia entre una conexión y una solicitud
- 7. ¿Cómo puedo implementar la sesión NHibernate por solicitud sin una dependencia en NHibernate?
- 8. ¿Cómo hacer la solicitud de keepalive http con curl?
- 9. Express.js Tiempo de espera de solicitud HTTP
- 10. iPhone y ASIHTTPRequest - No se puede iniciar la conexión HTTP
- 11. modos de liberación de conexión nhibernate: ¿por qué se recomienda la documentación utilizando "after_transaction"?
- 12. implementación de sesión por solicitud para WCF, NHibernate y Ninject
- 13. Reintentando una conexión HTTP
- 14. ¿Cómo se permite a NHibernate reintentar transacciones bloqueadas cuando se usa sesión por solicitud?
- 15. ¿Por qué display_errors cambia el código de estado HTTP?
- 16. ¿La URL de solicitud HTTP no forma parte del encabezado de solicitud HTTP?
- 17. ¿Cómo accedo a la solicitud HTTP?
- 18. ¿CONECTA la solicitud a un proxy HTTP directo a través de una conexión SSL?
- 19. Conexión HTTP persistente con RestSharp
- 20. longitud máxima de la solicitud HTTP GET?
- 21. ¿Es posible reenviar la solicitud de conexión NON-http a algún otro puerto en nginx?
- 22. Cómo hacer caché por solicitud http en ASP.NET 3.5
- 23. Cómo obtener la cadena de consulta no analizada de una solicitud http en Express
- 24. La conexión subyacente se cerró: La conexión se cerró inesperadamente
- 25. En Oracle, ¿cómo se cambia la base de datos 'predeterminada'?
- 26. Cómo analizar una solicitud HTTP en Java?
- 27. Cómo escribir una solicitud HTTP
- 28. Conexión del modelo de solicitud/respuesta HTTP con la cola asíncrona
- 29. Cambiar la cadena de agente de usuario en una solicitud http en R
- 30. Solicitud HTTP en Ubuntu
Tenga en cuenta que cuando el suministro de una IDbConnection a openSession(), usted no será capaz de utilizar el segundo nivel de caché (ver https://forum.hibernate.org/viewtopic.php?f=25&t=959178) – gurra777