Netty es un framework de Jboss que provee un manejo asíncrono en aplicaciones web, un framework ideal para hacer comet.
Netty es un cliente NIO infraestructura de servidor que permite el desarrollo rápido y sencillo de aplicaciones de red, tales como servidores de protocolo y los clientes. Simplifica y agiliza la programación de la red tales como TCP y UDP socket servidor.
"Rápido y fácil" no significa que una aplicación resultante sufrirá un mantenimiento o un problema de rendimiento. Netty ha sido diseñado cuidadosamente con las experiencias obtenidos de la implementación de una gran cantidad de protocolos como FTP, SMTP, HTTP, etc.Como resultado, Netty ha logrado encontrar una forma de lograr la facilidad de desarrollo, rendimiento, estabilidad y flexibilidad sin compromiso.
Mas adelante vamos a probar este framework.
Dejo links:
http://www.jboss.org/netty
http://www.jboss.org/netty/documentation.html
http://docs.jboss.org/netty/3.2/guide/html_single/index.html
Translate
lunes, 31 de octubre de 2011
domingo, 30 de octubre de 2011
Apache Mina y Apache AsyncWeb
Mediante una serie de técnicas llamadas Comet, puedes hacer una aplicación que envíe datos al usuario en tiempo real; es decir, que el navegador mantenga la conexión siempre abierta y reciba continuamente nuevos datos cuando los haya. Para servidores y aplicaciones clásicas que no estén preparadas para mantener muchas conexiones, la forma más sencilla es solicitar desde el navegador un cada X segundos nueva información (polling). Si tenemos muchos usuarios a la vez abriendo conexiones y haciendo peticiones a la BD nos encontramos con que nuestro servidor no da más de sí y deja de atender peticiones. Un ejemplo de polling clásico sería realizar peticiones mediante AJAX a un script PHP que devuelve nuevos datos en JSON cada 3 segundos y actualiza la tabla de novedades.
En el desarrollo web, Comet es un neologismo para describir un modelo de aplicación web en el que una petición HTTP mantenida abierta permite a un servidor web enviar datos a un navegador por Tecnología Push, sin que el navegador los solicite explícitamente. Comet es un término paraguas de múltiples técnicas para conseguir esta interacción. Todos estos métodos confían en características incluidas por defecto en navegadores, como JavaScript, en lugar de sobre plugins no disponibles por defecto. Existen frameworks en java que nos permiten hacer coment tenemos a Netty de Jboss, Atmosphere y Apache Mina.
Vamos a ver como funciona y nos permiten hacer coment Apache Mina. Apache Mina es un framework que nos permite hacer aplicaciones escalables y performantes basadas en network. Este framework provee una api asincrona para varios tipos de transportes y protocolos tcp/ip o UDP/ip via Java Nio.
Apache AsyncWeb que es parte de Apache Mina, rompe con la forma petición-respuesta de los servidores webs más usados. Esto le permite ser altamente escalable y capaz de soportar un rendimiento muy alto incluso en escenarios de alto procesamiento de latencia.
Una Api simple permite crear fácilmente servicios asincronos y integración con spring permite una configuración simple con gran flexibilidad. AsyncWeb permite también aplicar filtros a todas las requests.
Dejo links:
http://mina.apache.org/
http://mina.apache.org/asyncweb/
En el desarrollo web, Comet es un neologismo para describir un modelo de aplicación web en el que una petición HTTP mantenida abierta permite a un servidor web enviar datos a un navegador por Tecnología Push, sin que el navegador los solicite explícitamente. Comet es un término paraguas de múltiples técnicas para conseguir esta interacción. Todos estos métodos confían en características incluidas por defecto en navegadores, como JavaScript, en lugar de sobre plugins no disponibles por defecto. Existen frameworks en java que nos permiten hacer coment tenemos a Netty de Jboss, Atmosphere y Apache Mina.
Vamos a ver como funciona y nos permiten hacer coment Apache Mina. Apache Mina es un framework que nos permite hacer aplicaciones escalables y performantes basadas en network. Este framework provee una api asincrona para varios tipos de transportes y protocolos tcp/ip o UDP/ip via Java Nio.
Apache AsyncWeb que es parte de Apache Mina, rompe con la forma petición-respuesta de los servidores webs más usados. Esto le permite ser altamente escalable y capaz de soportar un rendimiento muy alto incluso en escenarios de alto procesamiento de latencia.
Una Api simple permite crear fácilmente servicios asincronos y integración con spring permite una configuración simple con gran flexibilidad. AsyncWeb permite también aplicar filtros a todas las requests.
Dejo links:
http://mina.apache.org/
http://mina.apache.org/asyncweb/
martes, 25 de octubre de 2011
Muere John McCarthy, pionero de la inteligencia artificial y padre de Lisp
El Lisp (o LISP) es una familia de lenguajes de programación de computadora de tipo multiparadigma con una larga historia y una sintaxis completamente entre paréntesis. Este lunes este lenguaje esta de luto dado que su creador John McCarthy murió. Copio un trozo de una noticia:
El lunes fallecía en Boston, a los 84 años, uno de los grandes pioneros de la industria de la computación: John McCarthy fue el primer ingeniero que habló del término "inteligencia artificial", en 1956, y también fue uno de los primeros que sugirió, en los años sesenta, que las aplicaciones informáticas podrían llegar a ser vendidas como un servicio, tal y como ocurre con el gas o la electricidad. McCarthy es la tercera gran figura del mundo de la tecnología que fallece en las últimas semanas, después de las muertes de Steve Jobs, el fundador de Apple, y Dennis Ritchie, creador del lenguaje de programación C.
McCarthy se unió a la facultad de Stanford en 1962, tras pasar cortos periodos en Princeton, Dartmouth y el MIT. Se retiró en 2000 tras recibir varios reconocimientos, como el Premio Turing en 1972 y la Medalla Nacional de las Ciencias en 1991.
Dejo Links:
http://www.publico.es/ciencias/403365/muere-john-mccarthy-pionero-de-la-inteligencia-artificial
http://www.lavanguardia.com/tecnologia/20111025/54236811431/muere-el-padre-de-la-inteligencia-artificial-moderna-john-mccarthy.html
http://es.wikipedia.org/wiki/John_McCarthy
El lunes fallecía en Boston, a los 84 años, uno de los grandes pioneros de la industria de la computación: John McCarthy fue el primer ingeniero que habló del término "inteligencia artificial", en 1956, y también fue uno de los primeros que sugirió, en los años sesenta, que las aplicaciones informáticas podrían llegar a ser vendidas como un servicio, tal y como ocurre con el gas o la electricidad. McCarthy es la tercera gran figura del mundo de la tecnología que fallece en las últimas semanas, después de las muertes de Steve Jobs, el fundador de Apple, y Dennis Ritchie, creador del lenguaje de programación C.
McCarthy se unió a la facultad de Stanford en 1962, tras pasar cortos periodos en Princeton, Dartmouth y el MIT. Se retiró en 2000 tras recibir varios reconocimientos, como el Premio Turing en 1972 y la Medalla Nacional de las Ciencias en 1991.
Dejo Links:
http://www.publico.es/ciencias/403365/muere-john-mccarthy-pionero-de-la-inteligencia-artificial
http://www.lavanguardia.com/tecnologia/20111025/54236811431/muere-el-padre-de-la-inteligencia-artificial-moderna-john-mccarthy.html
http://es.wikipedia.org/wiki/John_McCarthy
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:
4. Agregar en el mapping de las clases que se queren seleccionar como "cacheables" la siguiente entrada:
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:
Maven
Configurar o añadir el siguiente repositorio en el pom:
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:
Habilitar caché de segundo nivel y la configuración de la caché de consultas
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:
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:
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.
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:
3. Poner en el classpath del aplicativo el archivo de configuración ehcache.xml, según las instrucciones del proveedor.org.hibernate.cache.EhCacheProvider true
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:
Configurar o añadir el módulo del núcleo ehcache definido por la siguiente dependencias (pom.xml):terracotta-releases http://www.terracotta.org/download/reflector/releases true false
Si está configurando Hibernate y EHCache con terracotta, agregar las siguientes dependencias para su construcción (pom.xml):net.sf.ehcache ehcache-core ${ehcacheVersion}
Configurar EHCache como el proveedor de caché de segundo nivelnet.sf.ehcache ehcache-terracotta ${ehcacheVersion} org.terracotta terracotta-toolkit-${toolkitAPIversion}-runtime ${toolkitVersion}
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:
Para la creación de la instancia,net.sf.ehcache.hibernate.EhCacheRegionFactory
Para forzar a Hibernate a utilizar un singleton de EHCache CacheManager. Hibernate 3,0 a 3,2 uso:net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
Para la creación de la instancia, onet.sf.ehcache.hibernate.EhCacheProvider
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:
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
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:
Y esto compilaría a este código java:
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/
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
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.
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:
Para la interfaz:
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.
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.
http://msdn.microsoft.com/es-es/windowsphone/hh307892
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:
Sección 2:Plataforma Windows Phone
Sección 3:Datos y Servicios en Windows Phone
Sección 4:Trabajando con sensores
El link del curso es:
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, CRUD, Sharding, sin 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 carga. Los 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:
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 carga. Los 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:
Además viene una versión plus que trae los siguientes servicios:
Dejo Links:
http://www.infoq.com/news/2011/10/apache-tomee
http://openejb.apache.org/3.0/apache-tomee.html
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:
CDI | Apache OpenWebBeans |
EJB | Apache OpenEJB |
Javamail | Apache Geronimo JavaMail |
JPA | Apache OpenJPA |
JSF | Apache MyFaces |
JSP | Apache Tomcat |
JSTL | Apache Tomcat |
JTA | Apache Geronimo Transaction |
Servlet | Apache Tomcat |
Además viene una versión plus que trae los siguientes servicios:
Connector | Apache Geronimo Connector |
JMS | Apache ActiveMQ |
Web Services | Apache 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
jueves, 6 de octubre de 2011
Libros de Linux
Dejo un conjunto de links donde se pueden bajar libros de linux:
http://www.muylinux.com/2008/12/09/e-books-gratuitos-sobre-linux/
http://www.taringa.net/posts/linux/1146629/Coleccion-de-Libros-de-GNU_Linux-_Ubuntu-especialmente_.html
http://www.ubuntips.com.ar/2007/11/26/100-libros-sobre-linux-en-descarga-directa/
http://www.planetalibro.net/ebooks/eam/index.php?label=linux
A leer!
http://www.muylinux.com/2008/12/09/e-books-gratuitos-sobre-linux/
http://www.taringa.net/posts/linux/1146629/Coleccion-de-Libros-de-GNU_Linux-_Ubuntu-especialmente_.html
http://www.ubuntips.com.ar/2007/11/26/100-libros-sobre-linux-en-descarga-directa/
http://www.planetalibro.net/ebooks/eam/index.php?label=linux
A leer!
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!!
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.
Dejo Link:
http://project-voldemort.com/
Suscribirse a:
Entradas (Atom)