Entre lineas…
From: [email protected]
[mailto:[email protected]] On Behalf Of Gustavo Ringel
Sent: Saturday, January 17, 2009 16:48
To: [email protected]
Subject: [NHibernate-Hispano] Re: Ayuda con un query
Lo de poder cambiar a HQL esta claro Diego, pero a lo que me refiero es que
no va a funcionar exactamente igual si antes tenias que poner el truco del
synchronize y despues no. o sea que no es simplemente cambiar SQL a HQL.
>> El HQL hace la sincronización automáticamente porque puede saber que
tablas están influenciadas. Y si esta bien hecho debería ser lo mismo.
Segun lo que lei esto es valido solo para updates, con selects no hay
problema.
>> Para selects también es importante!! (casi seguro). Ej:
>>
>> session.Save(new Persona()); // no se ejecuta todavía porque
tiene "hilo"
>> Assert.AreEqual(1, session.CreateSQLQuery("select * from
Persona").List().Count);
>>
>> El sync en este caso seria para decirle a NH que haga el flush antes de
ejecutar ese query porque
>> va a utilizar la tabla Persona
Lo del parse del HQL a SQL obviamente es bueno y es la razon por la que uso
named-query siempre
>> Las queries de SQL también son parseadas, aunque imagino que es mucho mas
liviano, simple y rápido.
Respecto a lo del prepare estas seguro? Es un peligro si es asi. Porque voy
a querer que me largue prepare de 100 o 200 queries en HQL que las tengo
escritas solo para algunas veces que se ejecuta de algunas maquinas? Es una
locura me quita lugar del cache para queries que si ejecuto normalmente y no
me aporta nada para una query que ejecuto de vez en cuando...voy a
consultarle a Fabio cuando vuelva pero espero que esto no sea automatico o
se pueda cancelar al menos.
>> Seguro. De palabras del mismísimo Don Fabio.
>> Es complicado conocer como funciona el RDBMS internamente, pero alguien
había dicho que SQL Server
>> normalmente tenia todas las queries en cache porque cuando se ejecuta una
vez queda ahí cacheada...
>> Con el prepare lo único que haces es disminuir el tiempo de la primer
ejecución, porque tarde o temprano va a quedar
>> en cache. No esta mal y no veo porque podría serlo. Un buen motor de DB
debe manejar bien el cache y la memoria
>> internamente como para eliminar del cache las queries menos usadas.
Synchronize es importante tenerlo en cuenta, yo no tengo casos en los que me
aportaria algo por ahora, ya que no ejecuto updates con sql-queries en
elementos que cacheo, pero no lo tenia presente y ahora si.
Saludos.
Gustavo.
2009/1/17 Diego Jancic <[email protected]>
Hola Gustavo,
Conviene usar named-query por otros motivos, pero no porque haga la
sincronización solo… las ventajas que se me ocurren son (de las 2 primeras
no estoy 100% seguro, pero casi):
- Se parsea el query cuando se crea el SessionFactory, esto
significa que expande lo que esta entre corchetes (ej: select {p.*} from
Persona p), y reemplaza los parametros
- Tambien, cuando se crea el SessionFactory se manda el "prepare"
al RDBMS, de esta forma queda el parse cacheado para cuando se ejecute por
primera vez. Si el query es muy grande y complejo puede tener sentido.
- Si algun dia queres lo podes cambiar a HQL sin cambiar el código.
==> supongo que esta es la principal ventaja que mensiona Fabio
Con respecto a la transparencia, no lo hace solo porque en algunos casos es
imposible de saberlo, como cuando se usan SP, cursores que permiten
modificar la tabla, etc… De todas formas el sincronize supongo que no es tan
importante para el que recién comienza por 2 razones:
- No creo que use cache de segundo nivel. Por lo que el "espejismo"
de informacion va a estar solo dentro de la misma session (cache de 1er
nivel). Si usas session-per-request es casi nada de tiempo, y con un poco de
suerte no te das cuenta.
- Si usas "identity" como generador de ID, estas forzando a que
vaya a la DB en el momento, y no cuando se le cante. Te doy un ejemplo, en
donde puede variar si usas identity o hilo:
(el código de abajo esta sujeto a confirmación de Fabio, o a alguien que lo
pruebe, pero posiblemente sea verdad ;-))
Persona p = new Persona();
session.Save(p); // Si usas hilo, esto no se ejecuta todavia
session.CreateSQLQuery("update Persona set Edad = Edad +
1").ExecuteUpdate();
session.Flush(); // Aca se ejecuta el INSERT
Saludos!
From: [email protected]
[mailto:[email protected]] On Behalf Of Gustavo Ringel
Sent: Saturday, January 17, 2009 05:00
To: [email protected]
Subject: [NHibernate-Hispano] Re: Ayuda con un query
Hi Diego,
Gracias por la info sobre synchronize table, no se porque estaba seguro de
que era transparente, pero confirmas lo que advirtio Fredy hay temas con el
Cache segun parece tambien, no solo las otras cosas que mencionamos.
Estas 100% seguro que no se hace solo? porque en definitiva el propio Fabio
ha recomendado usar named query en esos casos para hacerlo transaparente y
no puso el OJO...bueno, si estuviera aca y no de vacaciones podria decir que
asume que el que escribe <sql-query> sabe lo que hace...voy a ver el tema
bien porque no habia prestado atencion la verdad.
Saludos.
Gustavo.
2009/1/17 Diego Jancic <[email protected]>
+1 a lo que dice Gustavo.
Ademas si lo haces como vos decis es muy probable que tengas problemas
porque se te sobre-escribe la information o NH te devuelve el objeto viejo
(porque hay caches).
Si vas a usar sql-query deberías usar también el sub tag <synchronize
table="…" /> para evitar problemas. De todas formas no hay nada mejor que
hacer un Get y un Update (a excepción de la performance, pero no creo que
esto pueda ser el primer cuello de botella).
Saludos
From: [email protected]
[mailto:[email protected]] On Behalf Of Gustavo Ringel
Sent: Friday, January 16, 2009 17:42
To: [email protected]
Subject: [NHibernate-Hispano] Re: Ayuda con un query
NHibernate no debiera tener problemas de comportamiento con CreateSQLQuery,
de hecho si bien no lo he probado NH te permite hacer un <sql-query>
cacheable...o sea que tiene que andar exacto con el mismo comportamiento que
<query> o criteria
Gustavo.
On Fri, Jan 16, 2009 at 9:33 PM, Fredy Treboux <[email protected]> wrote:
Claro, yo asumi que id_operacion era la pk de la tabla Operaciones,
solo por eso lo propuse.
En cuanto al problema que tenía... quien sabe que podría ser, al hacer
una consulta sql de esa forma puede que se quede con datos incorrectos
en el cache de la session?.
--~--~---------~--~----~------------~-------~--~----~
Para escribir al Grupo, hágalo a esta dirección:
[email protected]
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
-~----------~----~----~----~------~----~------~--~---