Translate

sábado, 22 de octubre de 2011

Cache de Hibernate

Generalmente todos los cache se basan en almacenar objetos en memoria para acelerar accesos posteriores, pero debemos aclarar que en Hibernate hay dos tipos de cache: el Primer Nivel y el Segundo Nivel.

Cache de Primer Nivel

 Es el que mantiene automáticamente Hibernate cuando dentro de una transacción interactuamos con la base de datos, en éste caso se mantienen en memoria los objetos que fueron cargados y si mas adelante en el flujo del proceso volvemos a necesitarlos van a ser retornados desde el cache, ahorrando accesos sobre la base de datos. Lo podemos considerar como un cache de corta duración ya que es válido solamente entre el begin y el commit de una transacción, en forma aislada a las demás. Hibernate lo maneja por defecto, no hay que configurar nada, si por alguna razón queremos deshabilitar o evitar el uso del cache, podemos usar un tipo especial de session: StatelessSession, se obtiene de la sessionFactory con el método openStatelessSession(). Se usa en el caso de los procesos batch, por ejemplo cuando se tiene que hacer inserts o updates masivos, así se evita que cada vez que se hace el save de un objeto, el mismo se quede en memoria y en el correr del proceso se produzca un error del tipo OutOfMemoryError. La StatelessSession no interactúa con el Cache de Primer Nivel ni con el Cache de Segundo Nivel, es casi como si se utilizara JDBC directamente.

Cache de Segundo Nivel

El Cache de Segundo Nivel permite ir varios pasos mas adelante en la mejora de la performance. La diferencia fundamental es que éste tipo de cache es válido para todas las transacciones y puede persistir en memoria durante todo el tiempo en que el aplicativo esté online, lo podríamos considerar como un cache global. Para habilitar el Cache de Segundo Nivel hay que realizar lo siguiente:
1. Seleccionar un Proveedor de Cache. Por ejemplo EhCache.
2. Agregar en el hibernate.cfg.xml los siguientes properties:

 
 org.hibernate.cache.EhCacheProvider
 true
3. Poner en el classpath del aplicativo el archivo de configuración ehcache.xml, según las instrucciones del proveedor.
4. Agregar en el mapping de las clases que se queren seleccionar como "cacheables" la siguiente entrada:

Hibernate define tres niveles de cache que determinan el aislamiento:

  • transactional: Garantiza un nivel de aislamiento hasta repeatable read. Es el nivel más estricto. Solamente se puede utilizar en clusters, es decir, con cachés distribuidas. 'read-write: Mantiene un aislamiento hasta el nivel de commited.
  • nonstrict read-write: No ofrece garantía de consistencia entre el caché y la base de datos. Es una es'trategia ideal para almacenar datos que no cambian habitualmente y que no sean demasiado críticos.
  • read-only: Es la estrategia de concurrencia menos estricta. Recomendada para datos que nunca cambian.

Otro tema importante es definir qué entidades se van a "cachear", los candidatos naturales son por ejemplo las clases que representan: provincias, países, monedas o similares. Hay que tener en cuenta que cuando se tienen relaciones one-to-many hacia éstas entidades, se debe configurarlas como fetch=select, no como fetch=join porque si no Hibernate va a "levantar" la relación haciendo un join en lugar de intentar obtener el objeto desde el cache. Información general

Ehcache se integra fácilmente con la hibernate. Gavin King, el responsable del modo de hibernate, es también un confirmador al proyecto EHCache. Esto asegura EHCache seguirá siendo un caché de primer nivel para la hibernate. Configuración de EHCache para Hibernate es simple. Los pasos básicos son:

  • Descargar e instalar EHCache en su proyecto
  • Configurar EHCache como un proveedor de memoria caché en la configuración de su proyecto Hibernate.
  • Configurar almacenamiento en caché de segundo nivel en la configuración de su proyecto Hibernate.
  • Configuración de Hibernate de caché para cada entidad, o la consulta que desea almacenar en caché.
  • Configurar ehcache.xml como sea necesario para cada entidad, colección o consulta configurado para almacenar en caché.


Maven
Configurar o añadir el siguiente repositorio en el pom:


   terracotta-releases
   http://www.terracotta.org/download/reflector/releases
   true
   false

Configurar o añadir el módulo del núcleo ehcache definido por la siguiente dependencias (pom.xml):

   net.sf.ehcache
   ehcache-core
   ${ehcacheVersion}

Si está configurando Hibernate y EHCache con terracotta, agregar las siguientes dependencias para su construcción (pom.xml):

   net.sf.ehcache
   ehcache-terracotta
   ${ehcacheVersion}



   org.terracotta
   terracotta-toolkit-${toolkitAPIversion}-runtime
   ${toolkitVersion}

Configurar EHCache como el proveedor de caché de segundo nivel

Para configurar EHCache como caché de segundo nivel de Hibernate, se debe configurar hibernate de la siguiente manera el archivo hibernate.cfg.xml:
Agregar la siguiente propiedad:

         net.sf.ehcache.hibernate.EhCacheRegionFactory
Para la creación de la instancia,

         net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
Para forzar a Hibernate a utilizar un singleton de EHCache CacheManager. Hibernate 3,0 a 3,2 uso:
         
         net.sf.ehcache.hibernate.EhCacheProvider
  
Para la creación de la instancia, o

         net.sf.ehcache.hibernate.SingletonEhCacheProvider

Para forzar a Hibernate a utilizar un singleton EHCache CacheManager.
        
         net.sf.ehcache.hibernate.SingletonEhCacheProvider
  

Habilitar caché de segundo nivel y la configuración de la caché de consultas
         
         net.sf.ehcache.hibernate.EhCacheProvider
  

Además de configurar la configuración de caché de segundo nivel de proveedores, usted tendrá que activar el caché de segundo nivel (por defecto está configurado en off - "falso" - por Hibernate). Esto se hace mediante el establecimiento de la siguiente propiedad en la configuración de su hibernación:

true
También es posible que desee activar la caché de consultas de Hibernate. Esto se hace mediante el establecimiento de la siguiente propiedad en la configuración de su hibernate config:

true

Configurar Hibernate Entidades de utilizar Segundo caché a nivel

Además de la configuración de la hibernación para uso de la caché de segundo nivel, Hibernate también se debe activar la caché de entidades, colecciones y consultas. Por ejemplo, para habilitar las entradas de caché para el com.somecompany.someproject.domain.Country se debe agregar lo siguiente al mapeo de hibernate:


...


Para habilitar el almacenamiento en caché, agregue el siguiente elemento.

Donde read-write|nonstrict-read-write|read-only es el tipo de cache.
Por ejemplo:


 
...



Esto también puede lograrse mediante la anotación @ caché, por ejemplo,

@Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Country { ... }

Definición de las estrategias de caché diferente

De sólo lectura: Cachés de datos que no se actualiza.

No estricta-lectura-escritura:Cachés de datos que a veces se actualiza sin bloqueo de la memoria caché. Si el acceso simultáneo a un elemento es posible, esta estrategia de concurrencia no garantiza que el producto devuelto de la caché es la última versión disponible en la base de datos. Configurar el tiempo de espera de caché en consecuencia.

De lectura y escritura: Cachés de datos que a veces se actualiza la vez que mantiene la semántica de "lectura confirmada" nivel de aislamiento. Si la base de datos está establecida en "lectura repetible", esta estrategia de concurrencia casi mantiene la semántica. De aislamiento de lectura repetible se ve comprometida en el caso de escrituras simultáneas.


Query Cache

Para mejorar la performance y rendimiento de las aplicaciones podemos utilizar Query Cache.
Si lo que interesa es "cachear" el resultado exacto de una consulta, no objetos individuales. Por ejemplo, si tenemos un método en un DAO que retorna la lista de Países registrados en la base de datos, es muy probable que siempre retorne el mismo resultado ya que esa tabla no cambia a menudo, entonces es recomendable establecer la consulta como "cacheable".

Hay que tener en cuenta que el query cache solo almacena los identificadores de los objetos del resultado, es decir que lo debemos usar combinado con el Cache de Segundo Nivel. Los pasos serían:

1. Establecer el property hibernate.cache.use_query_cache=true en el hibernate.cfg.xml
2. Configurar la entidad Pais como "cacheable"
3. Establecer la consulta como "cacheable":



List paises = sess.createQuery("from Pais") .setCacheable(true) .list();


Por lo tanto, la primera vez que se ejecuta la consulta, se retorna la lista de Paises desde la tabla mediante un select, pero a partir de ese momento toda vez que se repita el query, el resultado va a ser retornado desde el cache, evitando la comunicación con la base de datos.

¿Que pasa si agrego un nuevo Pais?

Entonces el query dejaría de ser válido, solo si agregamos un nuevo Pais pasando por la session de Hibernate, el query se invalida automáticamente para que la próxima vez que se ejecute la consulta vuelva a obtener el resultado desde la base de datos. Es importante aclarar que el comportamiento anterior no se cumple si se inserta un Pais por afuera del aplicativo, es decir con un insert directo a la tabla, o si se tiene dos aplicativos separados que apuntan a la misma base de datos, en ese caso habría que usar JNDI para que todos compartan la misma SessionFactory.

Es recomendable usar el query cache solo en los casos en que una consulta se repite constantemente y la entidad resultado no cambia frecuentemente, por ejemplo: Países, Provincias, etc.

jdart

jdart es compilador a código java el nuevo lenguaje de google Dart. El objetivo es poder portar codigo dart a la plataforma. Actualmente se encuentra en desarrollo.
En la pagina del proyecto podemos ver un ejemplo del compilador:

main() {
  print("hello world");
}


Y esto compilaría a este código java:

public class test {
  public static void main(java.lang.String[]);
    Code:
       0: invokedynamic #18,  0             // InvokeDynamic #0:__main__:()V
       5: return        

  public static java.lang.Object __main__();
    Code:
       0: ldc           #21                 // String hello world
       2: invokedynamic #27,  0             // InvokeDynamic #1:print:(Ljava/lang/String;)V
       7: aconst_null   
       8: areturn       
}



Me parece una buena idea, todavía esta en desarrollo pero pinta lindo!
Dejo links:
http://code.google.com/p/jdart/
http://www.dzone.com/links/r/jdart_dart_to_jvm_bytecode_compiler_using_invoked.html
http://www.dartlang.org/

jueves, 20 de octubre de 2011

Recursos sobre Node.js

Node.js es un entorno JavaScript de lado de servidor que utiliza un modelo asíncrono y dirigido por eventos. Es muy interesante la propuesta del framework dejo un excelente manual para empesar:
http://www.rmunoz.net/introduccion-a-node-js.html

Dejo un libro de Node.js :
http://www.nodebeginner.org/index-es.html


domingo, 16 de octubre de 2011

Identidad del objeto en hibernate


Una aplicación puede acceder simultáneamente al mismo estado persistente en dos Sessiones diferentes. Sin embargo, una instancia de una clase persistente nunca se comparte entre dos instancias de Session. Por lo tanto, existen dos nociones diferentes de identidad:



Identidad de Base de Datos
foo.getId().equals( bar.getId() )

Identidad JVM
foo==bar

Para los objetos unidos a una Session en particular (por ejemplo, en el ámbito de una Session) las dos nociones son equivalentes y la identidad de la JVM para la identidad de la base de datos se encuentra garantizada por Hibernate. Mientras la aplicación acceda simultáneamente al "mismo" objeto (identidad persistente) en dos sesiones diferentes, las dos instancias serán realmente "diferentes" (identidad JVM). Los conflictos se resuelven usando un enfoque optimista y el versionado automático.

Este enfoque deja que Hibernate y la base de datos se preocupen de la concurrencia. Además provee la mejor escalabilidad, ya que garantizando la identidad en unidades de trabajo monohilo no necesitan bloqueos caros u otros medios de sincronización. La aplicación no necesita sincronizar sobre ningún objeto, siempre que se mantenga un solo hilo por Session.

Dentro de una Session la aplicación puede usar con seguridad == para comparar objetos. Sin embargo, una aplicación que usa == fuera de una Session, podría ver resultados inesperados. Esto podría ocurrir incluso en sitios algo inesperados. Por ejemplo, si pone dos instancias separadas dentro del mismo Set ambas podrían tener la misma identidad de la base de datos (por ejemplo, representar la misma fila). Sin embargo, la identidad JVM, por definición, no está garantizada para las instancias en estado separado.

El desarrollador tiene que sobrescribir los métodos equals() y hashCode() en las clases persistentes e implementar su propia noción de igualdad de objetos. Nunca se debería usar el identificador de la base de datos para implementar la igualdad. Use una clave de negocio, una combinación de atributos únicos, usualmente inmutables. El identificador de la base de datos cambiará si un objeto transitorio es hecho persistente. Si la instancia transitoria (usualmente junto a las instancias separadas) es mantenida en un Set, cambiar el código hash rompe el contrato del Set. Los atributos para las claves empresariales no tienen que ser tan estables como las claves principales de la base de datos, sólo tiene que garantizar estabilidad en tanto los objetos estén en el mismo Set.

Este no es problema de Hibernate, sino que simplemente se tiene que implementar la identidad y la igualdad de los objetos Java.


sábado, 15 de octubre de 2011

Para que la gente prueba smalltalk facilmente

Una forma fácil de probar Smalltalk por medio de la web es el siguiente sitio:

http://amber-lang.net/learn.html

Este sitio nos permite programar en Smalltak por medio de una consola web. Genial idea.

lunes, 10 de octubre de 2011

Google Dart



Como habíamos dicho el post anterior google presento su nuevo lenguaje como alternativa a Javascript. Dart tienen las siguientes características:


  • basado en clases, herencia simple con interfaces
  • tipado estático opcional
  • un hilo de ejecución
  • lexico similar a Javascript
  • funciones Lambda (x) => x
  • recarga de operadores
  • interpolación de String: "Hello ${foo}"
  • multiproceso basado en actores


Veamos un ejemplo:


main() {
   var name = 'World';
   print('Hello, ${name}!');
}


Simple. Veamos como escribir la función que calcule la secuencia de figonacci:


int fib(int n) {
   if (n <= 1) return n;
   return fib(n - 1) + fib(n - 2);
}


main() {
   print('fib(20) = ${fib(20)}');
}


Veamos un ejemplo con clases:


class Point {
  
  Point(this.x, this.y);
  
  distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return Math.sqrt(dx * dx + dy * dy);
  }
  
   var x, y;
}


main() {
  Point p = new Point(2, 3);
  Point q = new Point(3, 4);
  print('distance from p to q = ${p.distanceTo(q)}');
}


Por lo poco que leí no tiene mayor innovación, es un lenguaje con algunas mejoras ante javascript. Pero no creo que sea capaz de desplazarlo.


Dejo links: 
http://www.dartlang.org/
http://www.dartlang.org/docs/getting-started/
http://googlecode.blogspot.com/2011/10/dart-language-for-structured-web.html



sábado, 8 de octubre de 2011

Inicializadores (o algo así) en Java

Este post esta dedicado a mi amigo personal Christian, que me mostró esto que realmente no lo conocía.
Supongamos que tenemos una interfaz y queremos hacer un clase anonima que implemente esta Interfaz pero necesitamos inicializar valores. No podemos llamar al constructor dado que es una clase anonima por lo tanto podemos inicializar el código de la siguiente manera:


public class Main {

	public static void main(String[] args) {
		IEjemplo ejemplo = new IEjemplo() {
			
			private String saludo;
			
			//Inicializador 
			{
				saludo = "Holass";
				System.out.println("Inicializo en el inicializador!!");
			}
			
			@Override
			public void metodoDeEjemplo() {
				System.out.println(saludo);				
			}
		};
		
		ejemplo.metodoDeEjemplo();
	}

}


Para la interfaz:


public interface IEjemplo {
	
	void metodoDeEjemplo();

}


Y la salida del programa seria:
Inicializo en el inicializador!!
Holass


La verdad no tenia idea que se podía hacer eso en Java.

Todos los días se aprende algo nuevo.

Curso Online de Desarrollo de Aplicaciones en Silverlight para Windows Phone

En el blog le damos poca atención al mundo microsoft, pero ahora voy ha hacer una excepción dado que la gente de microsoft preparo unos cursos que estaría bueno mirarlos, dejo una pequeña reseña y el link: 
Este curso consta de varios vídeos, presentaciones y ejercicios que guían en el diseño y desarrollo de aplicaciones para Wïndows Phone en Silverlight.
Lo hemos dividido en las siguientes secciones:

El link del curso es:
http://msdn.microsoft.com/es-es/windowsphone/hh307892



Los tontos hablan bien de una persona solo porque esta muerta


viernes, 7 de octubre de 2011

Oracle NoSQL?

Oracle ha anunciado el dispositivo Big Data corriendo con Oracle NoSQL base de datos, una nueva base clave y valor basado en Oracle Berkeley DB Java Edition. Algunas de las características incluyen: miles de millones de filas de almacenamiento en discos y terabytes en B-tree, transacciones ACID, CRUDShardingsin punto único de fallo, la recuperación de desastres a través de la replicación de centros de datos.


La base de datos Oracle NoSQL es una base clave-valor diseñada para una alta escalabilidad y disponibilidad, y se despliegan en múltiples nodos replicados para conmutación rapida por error y balanceo de cargaLos datos se accede a través de una API de Java con Get, Put y Delete empaquetada en un archivo JAR. Otras características incluyen:
  • Java puro
  • Capacidad: miles de millones de registros y de múltiples terabytes de datos en un almacenamiento 
  • Automática hash-function basado en la partición de datos y distribuida
  • Transacciones ACID
  • Con las operaciones CRUD con garantías de durabilidad ajustable
  • No hay ningún punto único de fallo
  • soporta Sharding
  • Resistencia al fallo de un nodo o varios nodos de almacenamiento
  • Recuperación de desastres mediante la replicación de centros de datos
  • Soporta miles de nodos
  • Copia de seguridad / restauración a nivel de nodo
Bueno simplemente hay que probarla!!

Dejo Link:

Apache TomEE Certifico Web Profile Compatible

Apache sorprende con un nuevo producto, Apache TomEE (se pronuncia Tommy y es la union de TomCat y Java EE)

La idea es tener un Web Profile basado en Tomcat que no influya en este proyecto y basado en productos de apache. Veamos los productos que lo conforman:
 

CDIApache OpenWebBeans
EJBApache OpenEJB
JavamailApache Geronimo JavaMail
JPAApache OpenJPA
JSFApache MyFaces
JSPApache Tomcat
JSTLApache Tomcat
JTAApache Geronimo Transaction
ServletApache Tomcat


Además viene una versión plus que trae los siguientes servicios: 


ConnectorApache Geronimo Connector
JMSApache ActiveMQ
Web ServicesApache CXF






Dejo Links:
http://www.infoq.com/news/2011/10/apache-tomee
http://openejb.apache.org/3.0/apache-tomee.html

Programa WebExpert de Google AdWords



Estuve leyendo esto y me intereso, la verdad no lo conocía (copio y pego) :

Queremos brindarte la educación, capacitación y el soporte que necesitás para ofrecerle más valor a tus clientes y, como consecuencia, hacer crecer tu negocio. Este programa es ideal para:
  • Webmasters y desarrolladores web
  • Cualquier persona o empresa que trabaje para un negocio online
  • Agencias de publicidad y marketing digital
Al aumentar tus habilidades online y el conocimiento de los productos de Google, tendrás herramientas para atraer potenciales clientes y aportar más y mejores beneficios a tus clientes actuales.
Suena interesante me voy a registrar!

Dejo el link:

http://www.google.com.ar/adwords/webexpert/#utm_source=ar-ha-CTPT&utm_medium=ha&utm_campaign=es


martes, 4 de octubre de 2011

Vistas dinámicas del blog

Google nos ofrece un nuevo servicio que es poder ver nuestro blog en forma dinámica. Es fácil, debes ingresar a : http://emanuelpeg.blogspot.com/view y hay un menú con las formas de ver el contenido.

Es muy bueno que el servicio baya mejorando y es una interesante propuesta.

Que lo disfruten!!

sábado, 1 de octubre de 2011

Voldemort una base de datos NoSQL con magia negra



No voy a hablar del enemigo Harry Poter, si no de la base de datos utilizada por LinkedIn. Voldemort es una base de datos NoSQL creada por LinkedIn para solucionar un problema de escalabilidad que tenia con las base de datos relacionales y luego donado a la comunidad.
Voldemort es una base de datos NoSQL orientada a guardar datos de forma clave-valor. Permite configurar diferentes Nodos los cuales contienen los datos y a la vez los datos se van replicando de forma que si se cae un nodo la base siga trabajando.
Algunas características de Voldemort:
  • Los datos se replican automáticamente a través de servidores múltiples.
  • Los datos son automáticamente particionados por lo tanto cada servidor contiene sólo un subconjunto de los datos totales
  • Las Fallas en el servidor son manejado de forma transparente
  • Permite sereailizar con diferentes frameworks Protocol Buffers, Thrift, Avro y Java Serialization; además permite seriabilizar objetos complejos como listas, arregles, etc.
  • Los elementos de datos están versionados para maximizar la integridad de los datos  sin comprometer la disponibilidad del sistema
  • Cada nodo es independiente de otros nodos 
  • Un buen rendimiento solo nodo: se puede esperar 10-20k de operaciones por segundo en función de las máquinas, la red, el sistema de disco, y el factor de replicación de datos
  • Utiliza una estrategia que permite tener nodos en distintos lugares geograficos.
Voldemort es libre y fue escrito en java. Tiene una buena documentación y una comunidad activa.


Dejo Link:
http://project-voldemort.com/