Diego, gracias por las las aclaraciones.
Respecto al prepare voy a ver con Fabio luego a que se refiere...
En ciertos casos y ciertos RDBMS (MySQL por ejemplo) prepared SQL's no se
eliminan del cache...o sea que no es un ben default.

Saludos.

Gustavo.

2009/1/17 Diego Jancic <[email protected]>

>
> 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
-~----------~----~----~----~------~----~------~--~---

Responder a