2010-01-01 8 views
6

Los estados de documentación de hibernación la siguientes:modos de liberación de conexión nhibernate: ¿por qué se recomienda la documentación utilizando "after_transaction"?

El parámetro hibernate.connection.release_mode de configuración se utiliza para especificar qué modo de liberación para su uso. Los valores posibles: * auto (por defecto) - equivalente a after_transaction en la versión actual. Rara vez es una buena idea cambiar este comportamiento predeterminado ya que las fallas debido al valor de esta configuración tienden a indicar errores y/o supuestos no válidos en el código de usuario. * on_close - dice usar ConnectionReleaseMode.OnClose. Esta configuración se deja para compatibilidad con versiones anteriores, pero se desaconseja su uso. ...

He creado una prueba de integración que provoca una excepción StaleObjectException abriendo dos sesiones al mismo tiempo y manipulando la misma entidad. Para garantizar que la prueba revierte todo al finalizar, el contenido de la prueba se coloca dentro de un TransactionScope; esto hace que las transacciones distribuidas se activen porque dos sesiones abrirán una conexión db contra la misma transacción ambiental. Quiero cambiar la configuración predeterminada de ConnectionReleaseMode a "OnClose", pero como se indicó anteriormente, la documentación no lo recomienda. ¿Alguien puede explicar por qué no es una buena idea cambiar el comportamiento predeterminado?

+0

¿Por qué usa un workscope manual en lugar de una forma nhiberna para administrar las transacciones? – Paco

+0

Mi UnitOfWork maneja las transacciones de la manera nhibernate. No puedo provocar una excepción StaleObjectStateException si uso una sola sesión dentro de la prueba (porque entonces no puedo obtener dos instancias de la misma entidad). De todos modos, esto está fuera del punto. – Marius

+0

No puedo responder a su pregunta (todavía), pero me gustaría saber más sobre el tema, porque espero problemas similares en el futuro en el proyecto en el que estoy trabajando. ¿Cómo se crea tu instancia de ISession? – Paco

Respuesta

5

Ok, ya que nadie más se molesta, intentaré responder a esto yo mismo :-) Si usa un patrón donde se realizan transacciones cuando se elimina la sesión (una transacción = una sesión), también podría usar el " OnClose "modo de lanzamiento. Si utiliza patrones en los que su sesión abarque varias transacciones (por ejemplo, conversación por transacción comercial http://dotnetchris.wordpress.com/2009/01/27/conversation-per-business-transaction-using-postsharp-and-ioc/), usar "OnClose" agilizaría los recursos no rentables porque no está liberando sus conexiones al grupo de conexiones al comprometer sus transacciones. El modo de lanzamiento predeterminado "after_transaction" liberará su conexión al comprometer la transacción, liberando así sus valiosas conexiones a la base de datos.

Cuestiones relacionadas