Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Referencia documento:
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc
Fecha: 12 de enero de 2012
Versin: 3.1.0
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Registro de Cambios
Revisiones
Nombre Role
Distribucin
Pg. 2 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
ndice de Contenidos
Pg. 3 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Pg. 4 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Control de cambios
Cambio Descripcin Pgina
Pg. 5 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Introduccin
Este documento recoge una serie de recomendaciones de Oracle Soporte planteadas
como buenas prcticas de desarrollo para aplicaciones que hagan uso de Oracle
WebLogic Server 11gR1.
Pg. 6 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
o Rendimiento
o Escalabilidad
o Alta disponibilidad
o Balanceo de carga
Pg. 7 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Pg. 8 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
JDBC es una API que proporciona una interfaz comn de programacin para el
acceso a diferentes bases de datos. JDBC lleva a cabo las conexiones a las bases de
datos mediante un driver que transforma llamadas de JDBC en llamadas nativas a la
base de datos.
JDBC est basado en el estndar de facto ODBC de Microsoft. ODBC por su parte,
est basado en la especificacin X/Open CLI. ODBC est disponible para Windows
y puede ser accedido mediante C, C++, Visual Basic y muchos otros lenguajes.
Mientras que ODBC simplemente una API a nivel de C, JDBC representa una capa
completa orientada a objeto de acceso a bases de datos. Ya que JDBC sigue de cerca
el funcionamiento de ODBC, se puede implementar un driver JDBC sobre un driver
ODBC (un puente JDBCODBC), que fue lanzado al mercado por INTERSOLV.
Drivers JDBC
Los drivers JDBC drivers son clases de implementacin para operaciones de bases de
datos. Podemos dividir los drivers en dos categoras:
Pg. 9 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Los drivers JDBC drivers son una simple coleccin de clases que implementan
mtodos conocidos y definidos por las especificaciones del driver JDBC. Estos
drivers se dividen en dos clases: two-tier y three-tier.
Arquitectura JDBC
Las aplicaciones que usan JDBC pueden usar uno de los cuatro tipos de drivers
JDBC distintos.
Pg. 10 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Un driver de tipo 2, proporciona un puente desde la API Java JDBC hasta el driver
native instalado en el cliente. El driver nativo tiene los protocolos para comunicarse
directamente con la base de datos.
Un driver de tipo 4 es una implementacin Java del driver nativo JDBC de la base de
datos. La base de datos y la aplicacin JDBC realizan llamadas Java-to-Java usando
este tipo de driver. Los drivers JDBC que permiten a una mquina cliente
comunicarse directamente con la base de datos se llaman implementaciones de dos
capas (two-tier), mientras que al driver de tipo 3 se le llama implementacin multi
capa.
La eleccin del tipo de driver correcto es tan importante que puede tener una gran
influencia en el rendimiento.
Pool de Conexiones
Una de las ventajas de usar un pool de conexiones sobre una conexin directa es que
las conexiones ya existirn cuando las aplicaciones quieran conectarse a una base de
datos.
Pg. 11 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Data Sources
Un data source es un concepto J2EE que permite abstraer una conexin JDBC. Con
un data source, un desarrollador o administrador puede especificar un objeto que
representa una base de datos. En el caso de WebLogic Server, un data source
contiene y gestiona un pool de conexiones.
Un usuario puede acceder a un data source y usarlo para crear una conexin a la
base de datos via el pool de conexiones asociado con el data source. El concepto de
data source permite a los desarrolladores despreocuparse completamente del pool
de conexiones o de la base de datos que se emplean para crear la conexin.
El grfico muestra como las aplicaciones Java usan JNDI para obtener una referencia
a un data source. Esto lo hace con la llamada lookup(). La aplicacin Java toma
despus una conexin del data source usando una llamada al mtodo
getConnection(). A partir de ese momento, la aplicacin Java est lista para hacer
llamadas a la base de datos usando esa conexin.
Shrink Frequency
Pg. 12 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Testeo de conexiones
Test Frequency: El nmero de segundos que pasa entre los tests que realiza
WebLogic Server sobre conexiones que no se estn usando. Las conexiones que
fallan en el test se cierran y se vuelven a abrir para intentar reestablecer una
conexin fsica vlida. Si se pone a 0, estos tests peridicos se deshabilitan.
Nota: Ambos parmetros requieren que se le indique un nombre de tabla para el test
y sobre la que se realizar un consulta de tipo SQL, select * from <tabla>.
Row Prefetch
Row Prefetch Enabled: Habilita la precarga de multiples filas (es decir, las que se
envan desde el servidor al cliente) en un acceso al servidor. Cuando un cliente
externo accede a una base de datos usando un driver JDBC a travs de
WebLogic Server, el row prefetching mejora el rendimiento mediante la
precarga de mltiples filas desde el servidor al cliente en un solo acceso.
WebLogic Server ignora esta opcin y no usa la precarga cuando el cliente y
WebLogic Server estn en la misma JVM.
Los valores mnimo y mximo para este parmetro son respectivamente 2 y 65536.
Cacheo de sentencias
Un objeto de tipo sentencia JDBC o statement se usa para enviar sentencias SQL a la
base de datos al igual que un objeto de tipo JDBC PreparedStatement se usa para
enviar sentencias SQL precompiladas con uno o ms parmetros.
Los objetos PreparedStatement se usan para sentencias SQL que se usan de forma
repetida con posibles variaciones en las variables, y al estar precompiladas se
aumenta el rendimiento de dichas llamadas. En el caso de llamadas a procedimiento
y funciones almacenadas, es necesario usar otro tipo de objetos, JDBC
CallableStatement.
Pg. 13 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
LRU, es decir, cuando llega una sentencia nueva, ya sea de tipo prepared o tipo
callable statement, la sentencia menos usada es reemplazada por la nueva en la
cach.
PinnedToThread
PinnedToThread es una opcin que puede mejorar el rendimiento al permitir que las
execute threads mantengar la conexin a base de datos incluso despus de que la
aplicacin cierre la conexin lgica.
Cuando PinnedToThread est habilitado, WebLogic Server fija una conexin del
pool de conexiones a la hebra la primera vez que sta reserva la conexin. En el
momento que la aplicacin termina de usar la aplicacin e invoca a
connection.close(), devolviendo la conexin al pool, Weblogic Server mantiene esta
relacin y no la devuelve realmente. Cuando la aplicacin a travs de la hebra
vuelve a realizar una peticin a base de datos, ya tiene disponible una conexin a
sta.
En este caso, donde la aplicacin reserva ms de una conexin dentro de una misma
hebra de ejecucin, Weblogic Server crear una conexin adicional y la mantendr
asociada a dicha hebra gracias a esta funcionalidad.
Pg. 14 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Batch Updates
Una aplicacin tpica puede llegar a ejecutar una gran cantidad de sentencias de
manipulacin de datos, operaciones de tipo insert, update o delete.
Gestin de transacciones
Con el fin de reducir esta carga extra de trabajo, se puede recomendar que, en la
medida de lo posible, mltiples transacciones se unifiquen dentro del menor nmero
de transacciones posibles.
Por defecto, las conexiones JDBC trabajan en modo auto-commit, lo que significa que
todas las operaciones enviadas a la base de datos se ejecutan automticamente como
una transaccin separada.
Connection.setAutoCommit(false)
Niveles transaccionales
TRANSACTION_READ_UNCOMMITTED
Pg. 15 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
TRANSACTION_READ_COMMITTED
TRANSACTION_REPEATABLE_READ
TRANSACTION_SERIALIZABLE
Dirty reads: Una fila ha sido modificada por otro proceso y esa modificacin no
ha hecho commit an.
Non-repeatable read: Una fila ha sido modificada por otro proceso que ha
confirmado la modificacin..
Phantom row: Un fila ha sido eliminada por otro proceso, y el borrado no ha
sido confirmado an.
Pg. 16 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
EclipseLink incluye soporte para EJB 3.0 y la API de Persistencia de Java (JPA) en
entornos Java EE y Java SE incluyendo integracin con gran variedad de servidores
de aplicaciones, entre los que se encuentran:
Pg. 17 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
JBoss
varios contenedores web como Apache Tomcat.
Generacin de esquemas
Se tratarn los siguientes temas en este apartado:
@CascadeOnDelete
@Index
@CascadeOnDelete
ON DELETE CASCADE es una restriccin de tipo foreign key que automticamente
borra las filas dependientes. Use esta annotation para especificar que cuando se
realice una operacin de borrado sobre un objeto de la base de datos sea borrado
tambin en tablas secundarias o relacionadas.
Comportamiento de CascadeOnDelete
Realizar Hace esto...
CascadeOnDelete en
este objeto
Entidad Define que las tablas secundarias o unidas con join deben
borrarse en cascada
OneToOne mapping Borrado en cascada de objetos relacionales en la base de
datos. Slo permitido para mapeos de mappedBy/target
de foreign key OneToOne (debido a la restriccin de la
direccin)
OneToMany mapping Para OneToMany usando mappedBy o JoinComumn, el
borrado de un objeto relacional se hace en cascada en la
base de datos. Para OneToMany usando JoinTable, el
borrado de la table del join se hace en cascada en la base
de datos ( a los objetos target no se les puede aplicar
cascada incluso si son privados debido a la restriccin de
direccin).
ManyToMany El borrado de la tabla del join se hace en cascada en la
mapping base de datos ( a los objetos target no se les puede aplicar
cascada incluso si son privados debido a la restriccin de
direccin).
ElementCollection El borrado de la table collection se hace en cascada en la
mapping base de datos
Pg. 18 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
ManyToMany: No ejecutar SQL para borrar desde una tabla unida con join.
Ejemplo @CascadeOnDelete
En este ejemplo se realiza el borrado en cascada de la tabla secundaria Employee, y
todas sus relaciones.
@Entity
@SecondaryTable(name="EMP_SALARY")
@CascadeOnDelete
public class Employee{
@Id
private long id;
Pg. 19 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<cascade-on-delete>true</cascade-on-delete>
@Index
Un ndice es una estructura de base de datos definida para una tabla, para mejorar el
rendimiento de consultas y bsquedas de conjuntos de columnas. Use la annotation
@Index en el cdigo o el elemento <index> en el descriptor eclipselink-orm.xml para
crear un ndice en una tabla.
@Index Attributes
Attribute Description Default Required?
catalog Catlogo del Default catalog No
INDEX.
columnNames Especifica el Para una Entity, la No requerido
conjunto de tabla. Para un cuando existen
columnas sobre atributo, la tabla y la annotations en un
las que el ndice columna. campo o mtodo.
est definido.
name El nombre del <table>_<column No
Pg. 20 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
INDEX. >_INDEX
(pero debe
proporcionarse un
nombre)
schema El esquema del Default schema No
INDEX.
table La tabla sobre la La tabla primaria de No
que est la entidad.
definido el
ndice, por
defecto para
entidades la
tabla primaria.
unique Especifica false No
cuando el ndice
es unique o no
es unique.
En este ejemplo se definen tres ndices, uno en first name, otro en last name y varias
columnas indexadas en first name y last name.
@Entity
@Index(name="EMP_NAME_INDEX", columns={"F_NAME","L_NAME"})
public class Employee{
@Id
private long id;
@Index
@Column(name="F_NAME")
private String firstName;
@Index
@Column(name="L_NAME")
private String lastName;
...
}
Pg. 21 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
table
secondary-table
join-table
collection-table
table-generator
Pg. 22 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Polticas de partitioning
Para configurar data partitioning, use la annotation @Partitioned y una o ms
annotations de polticas de partitioning. Las annotations para definir las diferentes
polticas son:
Pg. 23 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Las polticas de partitioning son objetos con nombre global en una unidad de
persistencia que son reusables entre diferentes descriptores o consultas. Esto mejora
la usabilidad de la configuracin, especficamente con annotations JPA y XML.
Si una transaccin modifica datos de varias particiones, debe usarse JTA para
garantizar el commit de los datos en 2 fases. Tambin puede configurarse una
conexin exclusiva en EntityManager para garantizar que un nico nodo se
encarga de una nica transaccin.
Pg. 24 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
@Entity
@IdClass(EmployeePK.class)
@UnionPartitioning(
name="UnionPartitioningAllNodes",
replicateWrites=true)
@ValuePartitioning(
name="ValuePartitioningByLOCATION",
partitionColumn=@Column(name="LOCATION"),
unionUnpartitionableQueries=true,
defaultConnectionPool="default",
partitions={
@ValuePartition(connectionPool="node2", value="Gotham"),
@ValuePartition(connectionPool="node3", value="Metropolis")
})
@Partitioned("ValuePartitioningByLOCATION")
public class Employee {
@Id
@Column(name = "EMP_ID")
private Integer id;
@Id
private String location;
...
Pg. 25 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Rendimiento de EclipseLink
EclipseLink proporciona un conjunto diverso de caractersticas para medir y
optimizar el rendimiento de aplicaciones. Puede activar o desactivar la mayora de
las caractersticas en los descriptores o en la sesin, haciendo que cualquier resultado
mejore el rendimiento global.
Introduccin a Optimizacin
Las consideraciones de rendimiento estn presentes en todos los pasos del ciclo de
desarrollo. Aunque esto implique conciencia con problemas de rendimiento en el
diseo y la implementacin, tampoco significa que tenga lograr el mejor rendimiento
posible a la primera.
Por ejemplo, si la optimizacin complica el diseo, djelo para la fase final del
desarrollo. Pero debera planificar estas optimizaciones desde la primera iteracin,
para que sea ms fcil integrarlas despus.
Esquema
Pg. 26 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Mapeos y descriptores
Sesiones
Cach
Acceso a datos
Consultas
Unidad de trabajo
query class
domain class
Pg. 27 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Nota: Use EclipseLink profiler para hacer profiling de ejecuciones de casos de uso
bajo el modelo de ejecucin single-threaded finite para encontrar cuellos de botella.
No use EclipseLink profiler para habilitar monitorizacin de un servidor multihilo
con ejecuciones largas.
Pg. 28 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
ReadAllQuery(com.demos.employee.domain.Employee): especifica la
consulta a la que se ha hecho profiling, y sus argumentos.
Monitorizacin de Rendimiento
Use el monitor de rendimiento para proporcionar informacin detallada de profiling
y monitoring en un entorno de servidor multihilo.
Pg. 29 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Las estadsticas se agrupan generalmente por total y tambin por tipo de consulta,
clase de consulta y nombre de consulta. Los contadores y temporizadores,
generalmente, se registran para las mismas operaciones, as que el tiempo por
operacin tambin podra calcularse.
Performance Monitor:1279113281664
Operation Value (ns)
Counter:CacheHits 1,375,664
Pg. 30 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Counter:CacheMisses 327
Counter:ClientSessionCreates 1,204,817
Counter:ConnectCalls 2
Counter:DataModifyQuery 48
Counter:DataModifyQuery:inventory 21
Counter:DataModifyQuery:order 27
Counter:DeleteObjectQuery 67,792
Counter:DeleteObjectQuery:Customer 1
...
Counter:ReadAllQuery 1,041,767.
Counter:ReadAllQuery:Item.findByCategory 733,827
Counter:ReadAllQuery:Item.findByCategory:CacheHits 733,779
Counter:ReadAllQuery:Item.findByCategory:CacheMisses 50
...
Counter:ReadObjectQuery 1,058,273
Counter:ReadObjectQuery:Item:item 130,063
Counter:ReadObjectQuery:Item:item:CacheHits 130,063
Counter:ReadObjectQuery:Item:item:CacheMisses 1
Counter:UnitOfWorkCommits 72,568
Counter:UnitOfWorkCreates 471,491
Counter:UnitOfWorkRollbacks 1
Counter:UpdateObjectQuery 71,498
Counter:UpdateObjectQuery:Customer 62,531
...
Info:LoginTime Wed Jul 14 08:55:41 EDT 2010
Info:SessionName file:/scratch/user_domains/servers/mt-1/app.jar
Timer:Caching 6,411,372,000
Timer:ConnectionManagement 17,225,641,000
Timer:DeleteObjectQuery 41,351,430,000
Timer:DeleteObjectQuery:Customer 4,441,000
Timer:DeleteObjectQuery:Customer:QueryPreparation 86,000
Timer:DeleteObjectQuery:Customer:SqlGeneration 28,000
Timer:DeleteObjectQuery:Customer:SqlPrepare 72,000
Timer:DeleteObjectQuery:Customer:StatementExecute 2,265,000
...
Timer:InsertObjectQuery 69,111,086,000
Timer:Logging 4,236,000
Timer:Merge 1,144,400,000
Timer:ObjectBuilding 31,914,397,000
Timer:QueryPreparation 984,396,000
Timer:ReadAllQuery 260,943,930,000
Timer:ReadAllQuery:Item:Item.findByCategory 14,790,333,000
Timer:ReadAllQuery:Item:Item.findByCategory:ObjectBuilding 250,959,000
Timer:ReadAllQuery:Item:Item.findByCategory:QueryPreparation 1,880,000
Timer:ReadAllQuery:Item:Item.findByCategory:RowFetch 113,552,000
Timer:ReadAllQuery:Item:Item.findByCategory:SqlGeneration 522,000
Timer:ReadAllQuery:Item:Item.findByCategory:SqlPrepare 2,055,000
Timer:ReadAllQuery:Item:Item.findByCategory:StatementExecute
107,382,000
...
Pg. 31 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Timer:Register 3,272,443,000
Timer:RowFetch 25,340,990,000
Timer:Sequencing 1,352,326,000
Timer:SqlGeneration 6,646,000
Timer:SqlPrepare 19,536,031,000
Timer:StatementExecute 508,589,220,000
Timer:TXAfterCompletion 1,854,152,000
Timer:TXBeforeCompletion 169,381,843,000
Timer:UnitOfWorkCommit 167,483,825,000
Timer:UpdateObjectQuery 46,440,589,000
Timer:UpdateObjectQuery:Customer 40,466,433,000
Timer:UpdateObjectQuery:Customer:QueryPreparation 867,496,000
Timer:UpdateObjectQuery:Customer:SqlGeneration 98,000
Timer:UpdateObjectQuery:Customer:SqlPrepare 1,319,333,000
Timer:UpdateObjectQuery:Customer:StatementExecute 32,901,366,000
Monitorizacin de consultas
Use Query Monitor para medir las ejecuciones de consultas y los aciertos de cache.
Esto puede ser til para anlisis de rendimiento en sistemas complejos. Habilite
Query Monitor de alguna de estas 2 formas:
value="QueryMonitor"/>
Pg. 32 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
LOB's
NChar's
XMLType's
TIMESTAMP (TZ, LTZ)'s
Native batch writing
Structured object-relational data-types
PLSQL data-types y stored procedures/functions
VPD y proxy authentication
RAC
XDK XML parser
Hierarchical selects (Select by prior)
Returning clause
Flashback history y flashback queries
Stored procedures, output parameters y output cursors
Oracle AQ
Parmetros de tipo IN
Parmetros de tipo OUT
Parmetros de tipo INOUT
Result sets
Parmetros de tipo CURSOR OUT
Object-relational datatypes (Struct, Array)
Oracle PLSQL types como TABLE, RECORD, BOOLEAN
Uso de stored procedure en named query y dynamic query
Uso de stored procedure para sobrecargar la persistencia de entidades,
actualizaciones, eliminacin y consultas.
Uso de stored procedure para sobrecargar el mapeo de consultas, inserciones y
eliminaciones.
En el caso del uso de triggers que actualizan datos que se requieren en la aplicacin
tenemos dispones las anotaciones @ReturnInsert, @ReturnUpdate y ReturningPolicy
para dicha funcionalidad.
Pg. 33 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Java Message Service (JMS) el API estandar para el acceso a sistema de mensajera en
Java.
Sin embargo hay que tener en cuenta que JMS no es un proveedor de servicio un
servidor Message-Oriented Middleware (MOM). Es simplemente un conjunto de
interfaces que definen un estndar de Java para acceder a productos de tipo
Enterprise Messaging (EM).
Balanceo de Carga
Tolerancia a fallos
Notificacin de errores
Administracin
Seguridad e integridad de los mensajes
Protoco de envoi para mensajes binarios
El grfico muestra que los clientes JMS son aplicaciones conectadas al sistema MOM,
es decir, tanto el emisor como el receptor del mensaje son considerados clientes JMS.
Pg. 34 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Arquitectura JMS
JMS es una API para el acceso a sistemas de mensajera empresarial. JMS permite a
las aplicaciones Java compartir un sistema de mensajera para el intercambio de
mensajes. Simplifica el desarrollo de aplicaciones proporcionando una interfaz
estndar para la creacin, envo y la recepcin de mensajes.
En este mbito de JMS, JNDI se usa para crear un contexto inicial para una
connection factory de tipo JMS, que se usar para crear conexiones a proveedores de
servicio basados en JMS.
Pg. 35 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Esto implica que el servidor JMS agregue las peticiones concurrente de una
mismo cliente en una nica operaciones de E/S.
Los mensajes pueden ser entregados a travs de listeners de mensajes.
Se permite mltiples mensajes en una misma llamada de red.
Puede parametrizarse la cantidad maxima de mensajes a travs de la connection
factory.
Persistent Stores
Pg. 36 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Los almacenes JDBC pueden hacer ms fcil las labores de recovery en caso de
fallos ya que, al almacenarse en una base de datos, lo mas probable que se
encuentre en otra mquina de la red.
Disabled, donde las transacciones se completan tan pronto como se cachean sus
escrituras en memoria, en lugar de esperar a que las escrituras alcancen al disco.
Esta poltica es la ms rpida, pero la menos fiable desde el punto de visdta
transaccional. Puede ser ms de 100 veces ms rpido que otras polticas, pero
los cortes de luz fallos del sistema operativo pueden causar prdidas
mensajes duplicados.
Paging
Pg. 37 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
La opcin Message Buffer Size especifica la cantidad de memoria que se usar para
almacenar el cuerpo de los mensajes en memoria antes de que se paginen a disco. EL
valor por defecto de Message Buffer Size es aproximadamente un tercio del
maximum heap size para la JVM, con un mximo de 512 megabytes.
Por tanto, los servicios con una alta carga de mensajes deben considerar fijar una
quota, un umbral, y habilitar control de flujo para reducir el uso de memoria en el
servidor.
Throttling
En esta situacin:
Esta condicin requiere que el mensaje que se enva pase por el control de flujo.
Pg. 38 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Cuotas JMS
Define el nmero total de bytes que pueden ser almacenados en un destinatario que
usa esta cuota. Un valor de 0, significa que no se pueden enviar mensajes a un
destinatario sin exceder la quota. Un valor de -1 evita que WebLogic Server imponga
un lmite.
Pg. 39 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Por tanto, a travs de esta tcnica, desactivamos la poltica FIFO que impide que el
servidor JMS entregue mensajes pequeos cuando haya mensajes grandes ya
esperando por espacio, al permitir que los mensajes pequeos se adelanten a los
grandes cuando hay espacio suficiente para mensajes pequeos en el destinatario.
Umbrales o threshold
Control de flujo
Flow Maximum
El nmero mximo de mensajes por segundo permitido para un productor que est
experimentando una condicin de umbral (threshold condition). Cuando se controla
el flujo de un productor, nunca podr sobrepasar el nmero FlowMaximum de
mensajes por segundo.
Flow Minimum
Pg. 40 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
El nmero mnimo de mensajes por segundo permitido por un productor que est
experimentando una condicin umbral. Es el lmite inferior de flujo de un productor.
Esto es, WebLogic JMS no relentizar a un productor que haya alcanzado el umbral
de FlowMinimum.
Flow Interval
El perodo de tiempo, en segundos, mientras que un productor ajusta su flujo desde
el nmero FlowMaximum de mensajes hasta el FlowMinimun, viceversa.
Flow Steps
El nmero de pasos cuando un productor ajusta su flujo desde una cantidad de
mensajes Flow Maximum a una cantidad de mensajes Flow Minimum, viceversa.
Gestin de expirados
Para configurar una poltica de expiracin de mensaje en una plantilla existente para
los destinatarios, se puede seleccionar uno de las siguientes opciones de la lista de
Polticas de Expiracin en la pgina Delivery Failure de la pestaa de Configuracin:
Pg. 41 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Log: Elimina los mensajes expirados y escribe una entrada en el archivo de log
del servidor indicando que los mensajes se han eliminado del sistema. Esta
caracterstica ha sido declarada como deprecated.
Para ello, se puede configurar un servidor JMS para explorar activamente los
mensajes expirados de los diferentes destinos.
Hay que diferenciar entre los acuses de recibo o acknowledgments JMS y las
operaciones de commits.
Pg. 42 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Los servicios SAF de Weblogic Server pueden ser usados tanto por aplicaciones JMS
como por aplicaciones que usen Web Services Reliable Messaging (WA-RM). En el
primer caso, los productores locales JMS pueden enviar mensajes a destinos JMS
remotos. En el segundo, en los servicios SAF de tipo WSRM, los Web Services
pueden estar en Weblogic Server separados para intercambiar mensajes.
Habilita una entrega rpida y fiable de mensajes en las aplicaciones que corren
en WebLogic Server
Intervalo de Ventana
Un agente emisor de mensajes esperar para reenviar el mensaje de tipo batch hasta
que:
Pg. 43 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Tamao de Ventana
En caso de definirse, un agente emisor debe esperar para reenviar un mesaje de tipo
batch hasta que el nmero de mensajes en la fuente destino sea mayor igual que
este valor.
Pg. 44 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
JMS es una especificacin que define una interfaz para un servicio de mensajera
compatible con Java. Es una especificacin de interfaz, no una implementacin, ya
que los detalles de implementacin se dejan a los proveedores. JMS proporciona una
forma de producir y consumir mensajes.
En este mbito, donde JMS es un API simple de mensajera, y los MDBs son un
modelo de componentes que lo soporta en el contexto de un contenedor EJB,
trataremos el tema de anti-patrones en cada una de las tres principales reas de
aplicaciones JMS:
Veremos en detalle, haciendo una mirada crtica hacia lo que es probable que falle,
cada uno de los elementos, como el payload, el tipo de mensaje y el mensaje mismo.
Pg. 45 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
TextMessage, simple: Para JMS, el texto es texto, pero vamos a dividir los
mensajes de texto en diferentes versiones sencillas y versiones decoradas. Un
simple mensaje de texto utiliza texto sin formato, con delimitadores simples
de estructura. El texto simple es fcil de crear, fcil de consumir, y
razonablemente eficiente para muchas aplicaciones. Las desventajas son que
no proporciona meta-datos, con lo que se consigue menos acoplamiento, bajo
rendimiento para acceso aleatorio, pero un parseo no sencillo.
Pg. 46 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Cuando los desarrolladores crean una estructura de mensaje, pocos ponen atencin
en la optimizacin del mensaje, pero deberan. Slo debera transmitirse el mensaje
mnimo que permite a un consumidor realizar el trabajo requerido. Qu datos
adicionales pueden colarse en nuestros mensajes?
Por esta razn, debe limitarse el uso de XML para un conjunto limitado de
circunstancias:
Solucin: La regla general es que debe usarse XML cuando los requisitos de
rendimiento son ms indulgentes y los meta-datos son ms importantes, como
escribir en un archivo o comunicarse con una aplicacin externa. Internamente, la
aplicacin debe utilizar un mecanismo ms especializado como un MappedMessage
Pg. 47 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Tenga en cuenta que nuestro modelo de mensajera puede cambiar en funcin de los
requisitos de la aplicacin. La caja registradora y el servidor de la contabilidad se
encuentran dentro de la misma aplicacin, en el mismo lenguaje, y con el mismo
programa de mantenimiento. Podemos y debemos jugar con un mayor rendimiento
y simplicidad para conseguir un acoplamiento bajo. Sin embargo, la aplicacin de
inventario tiene circunstancias diferentes. Es una aplicacin diferente con un
conjunto diferente de necesidades, y es probable que funcione con un programa de
mantenimiento diferente. XML es apropiado en este caso.
Pg. 48 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Pg. 49 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
3.
4. if (message instanceof MapMessage) {
5.
6.
7. MapMessage mapMessage = (MapMessage)message;
8.
9.
10. try {
11.
12.
13. String orderId = mapMessage.getString("Order ID");
14.
15. String productId = mapMessage.getString("Product ID");
16.
17. int quantity = mapMessage.getInt("Quantity");
18.
19. double price = mapMessage.getDouble("Price");
20.
21.
22. OrderRequest orderRequest =
23.
24. new OrderRequest(orderId, productId, quantity, price);
25.
26.
27. OrderRequestHandler handler = new OrderRequestHandler();
28.
29. handler.handle(orderRequest);
30.
31.
32. } catch (JMSException jmse) {
33.
34. jmse.printStackTrace();
35.
36. }
37.
38.
39. }
40. else {
41.
42. System.err.println("OrderRequest must be a MapMessage
type!");
43.
44. }
45.
46. }
47.
48.
Deben ser cortos: sern mucho ms difcil mantener que los mtodos largos.
Pg. 50 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Pg. 51 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
http://java.sun.com/products/ejb/index.html.
Las diferencias entre los tipos de EJB permiten al servidor de aplicaciones optimizar
el rendimiendo siendo capaz de hacer estimaciones sobre el estado y el nivel de
persistencia del componente. Los EJBs que no tienen gestin del estado pueden tener
un mayor grado de pooling que los EJBs que tienen estado. Los tres niveles de
conducta que un componente puede asumir son:
No mantener el estado entre las peticiones de los clientes como lo EJBs stateless
session o los EJBs de tipo message-driven.
Mantener el estado, pero no persistente, como los EJB stateful session.
Persistente, como los EJBs de entidad.
Interfaces EJB
Excepto los de tipo message-driven, los EJBs tienen las siguientes interfaces que un
cliente puede usar:
Home interface
Local Home interface
Remote interface
Local interface
Pg. 52 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
EJBFiles.class
\relative\path\of\package\name\EJBFiles.class
\META-INF\ejb-jar.xml
\META-INF\weblogic-ejb-jar.xml
\META-INF\weblogic-cmp-rdbms-jar.xml
La especificacin EJB indica que una sesin EJB slo puede ser accedida por un
cliente en cualquier momento. Esto significa que si un contenedor slo cre una
instancia EJB y hay 10 clientes solicitando el uso de dicha instancia, slo un cliente
Pg. 53 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
podr acceder al mismo tiempo. El resto de los clientes debern bloquearse y esperar
a que el primer cliente termine de usar EJB de tipo stateless session.
En caso de uso por parte de un cliente, ste no puede mantener el control de un bean
para siempre. Hay un perodo de timeout, RMI request timeout, despus del cual, la
llmada al mtodo falla y el bean queda libre de nuevo.
Cuando Weblogic Server arranca crea y publica el pool de EJBs libres con la cantidad
de instancias que se han indicadp a traves del elemento de despliegue initial-beans-
in-free-pool en el fichero weblogic-ejb-jar.xml. Por defecto, este valor es 0.
Si todas las instancias de una clase EJB estn activas y se alcanza el max-beans-in-
free-pool, las nuevas peticiones de clientes sobre las clases EJB se quedarn
bloqueadas hasta que un EJB activo complete la llamada al mtodo. Si la transaccin
caduca o, para llamadas no transaccionales, pasan mas de cinco minutos, WebLogic
Server lanza una RemoteException al cliente remoto o una EJBException para el
cliente local.
Si el nmero de EJBs de tipo stateless session es muy alto, el pool contiene instancias
inactivas que consume memoria. Si el nmero es muy bajo, un cliente puede no
obtener una instancia cuando lo necesite.
Pg. 54 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Por defecto, no existen instancias EJB de tipo stateless session en WebLogic Server en
el momento de arranque. Como los clientes acceden a los beans individualmente,
WebLogic Server inicializa nuevas instancias de EJB a medida que las necesita.
Sin embargo, si se quiere que existan instancias inactivas de EJB en WebLogic Server
cuando se arranca, hay que especificar el nmero en el descriptor de despliegue
initial-beans-in-free-pool en el archivo weblogic-ejb-jar.xml.
Esto puede mejorar el tiempo inicial de respuesta cuando los clientes acceden a EJBs,
porque las peticiones iniciales de los clientes se pueden satisfacer mediante la
activacin del bean desde el free pool, en lugar de inicializarlo y luego activarlo. Por
defecto, initial-beans-in-free-pool est a 0.
El tamao mximo del free pool se limita por la memoria disponible o por el valor
del elemento de despliegue max-beans-in-free-pool.
<weblogic-enterprise-bean>
<ejb-name>InsuranceQuoteBean</ejb-name>
<stateless-session-descriptor>
<pool>
<max-beans-in-free-pool>15</max-beans-in-freepool>
<initial-beans-in-free-pool>5</initial-beans-infree-
pool>
</pool>
</stateless-session-descriptor>
...
</weblogic-enterprise-bean>
Los MDB dependen en gran medida de los conceptos de mensajera que se definen
como parte de la especificacin JMS. La especificacin JMS define un conjunto de
interfaces que abstraen los detalles de implementacin de sistemas middleware
orientados a mensajes. Los clientes JMS envan mensajes a destinatarios JMS
Pg. 55 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
En este mbito, los MDBs son EJBs especiales encargados de recibir los mensajes
enviados de los clientes JMS.
<weblogic-enterprise-bean>
<ejb-name>InsuranceQuoteBean</ejb-name>
<message-driven-descriptor>
<pool>
<max-beans-in-free-pool>15</max-beans-in-freepool>
<initial-beans-in-free-pool>5</initial-beans-infree-
pool>
</pool>
</message-driven-descriptor>
...
</weblogic-enterprise-bean>
Los Stateful session beans son muy similares a los stateless session beans, hasta tal
punto que se implementan exactamente de la misma manera.
Sin embargo, los beans stateful session se ocupan de mantener el estado del cliente a
travs de mltiples llamadas, al almacenando las propiedades de estado en los
atributos del propio componente. Un contenedor EJB es el responsible de, en
subsecuentes llamadas, enrutar la peticin al mismo bean stateful que almacena su
informacin de estado.
Weblogic Server permite controlar cuantas instancias de stateful session EJB puede
haber en memoria por cada tipo de EJB en un instante de tiempo, estableciendo
umbrales por tipo de EJB.
No se puede fijar ningn umbral que aplique a un grupo de tipos de EJBs juntos.
Adems, slo se puede controlar el nmero de EJBs que se permiten en cacheno
Pg. 56 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
hay mecanismos para controlar la cache, por ejemplo, por la cantidad de memoria
ocupada por la suma de las instancias.
Con este nivel de gestin de cach, hay que contestar a estas preguntas:
El grfico muestra que el servidor de aplicaciones alojar los stateful session beans
hasta el nmero especificado en la opcin max-beans-in-cache.
WebLogic Server usa una cach de instancias para mejorar el rendimiento de los
EJBs stateful session. El mecanismo de cache almacena instancias activas de EJBs en
memoria para que estn disponibles inmediatamente para las peticiones de los
clientes.
Antes de que un cliente empiece a acceder a un bean stateful session, crea una nueva
instancia de bean para usar durante su sesin con el bean. Mientras la sesin est
activa, la instancia se cachea en memoria y cuando la sesin se acaba, la instancia se
destruye.
Pg. 57 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Weblogic Server ofrece dos opciones ante esta situacin con el fin de liberar memora
en la cach:
Ambas acciones tienen como efecto la reduccin del nmero de EJBs que estn
consumiendo parte de la cach de forma que un slot quede disponible para otro EJB.
Para ello, hay que calcular el tamao aproximado de cada tipo EJB, el nmero de
tipos EJB desplegados en un sistema y la cantidad total en el heap. A esta cantidad
se le debe sumar coste adicional y fijo de entre dos o tres MB de RAM para
administracin.
Finalmente, hay que considerar la opcin del clustering como solucin de cache
remota, ya que la replicacin de EJBs se encargar de usar el espacio libre de otros
servidores.
Por tanto, slo ciertos tipos de EJBs son elegibles para el proceso de passivation.
Pg. 58 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Cuando se activa la poltica LRU para la gestin de la cache, el contenedor realiza las
siguientes operaciones:
Enva instancias a disco, tan pronto como una instancia se vuelve inactiva por
idle-timeout-seconds, independientemente del valor de max-beans-in-cache.
Tambin realiza esta operacin si se alcanza max-beans-in-cache, aunque idle-
timeout-seconds no haya expirado
El proceso de passivation se produce slo cuando el EJB es elegible para ello y hay
presin por falta de recursos en el servidor, o bien Weblogic Server lleva a cabo un
mantenimiento regular de cach.
Se puede especificar ese mecanismo de forma explcita para EJBs que hayan
alcanzado idle-timeout-seconds modificando el elemento cache-type del archivo
weblogic-ejb-jar.xml.
Cuando escasean los recursos y la cach necesita memoria, Weblogic Server examina
los EJBs que estn acercndose a su lmite de max-beans-in-cache. De esos beans,
Pg. 59 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Weblogic Server elimina las instancias EJBs que no hayan sido usadas durante idle-
timeout-seconds de la cach, en lugar de moverlos a disco.
Una vez que una instancia de un EJB stateful session pasa a disco, un cliente tiene
idle-timeout-seconds para utilizar la instancia EJB. Pasado este tiempo, WLS lo
elimina de disco.
<weblogic-enterprise-bean>
<ejb-name>ShoppingCartBean</ejb-name>
<stateful-session-descriptor>
<stateful-session-cache>
<max-beans-in-cache>1000</max-beans-in-cache>
<idle-timeout-seconds>60</idle-timeout-
seconds>
</stateful-session-cache>
</stateful-session-descriptor>
...
</weblogic-enterprise-bean>
Cuando decimos que un EJB es persistente, nos referimos a que los datos del EJB
persistirn o existirn est o no el EJB en memoria. La persistencia de un EJB puede
ser implementada de varias formas. Por ejemplo, el objeto puede ser almacenado en
una base de datos relacional, en un archivo o colocado en otro medio.
Cada vez que los atributos de los objetos en memoria se modifican, sus homlogos
persistentes se actualizan automticamente. Ya que el valor del EJB se almacena de
manera persistente, mltiples clientes pueden acceder a los mismos datos en el
mismo instanta. Los contenedores pueden implementar dos peticiones de acceso por
parte de los clientes al mismo dato de distintas formas.
Por ejemplo, el contenedor puede serializar el acceso a los datos a travs de un single
object, permitiendo slo a un single client el uso del objeto al mismo tiempo, o puede
crear dos copias del dato persistente donde el contenedor sera responsable de
coordinar modificaciones concurrentes de los datos.
Dos clientes que usan la misma entidad EJB no es lo mismo que dos clientes que
usan el mismo session EJB. De hecho, dos clientes que usan el mismo entity EJB
significa que ambos tienen acceso a los mismos datos persistentes. El contenedor
puede crear una instancia o mltiples para gestionar cmo mltiples clientes
Pg. 60 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Definir los tags en el archivo weblogic-ejb-jar.xml para un entity bean es muy similar
a como se hace con el resto de tipos de beans.
<weblogic-enterprise-bean>
<ejb-name>OrderBean</ejb-name>
<entity-descriptor>
<pool>
<max-beans-in-free-pool>15</max-beans-in-freepool>
<initial-beans-in-free-pool>5</initial-beans-infree-
pool>
</pool>
<entity-cache>
<max-beans-in-cache>1000</max-beans-in-cache>
<idle-timeout-seconds>60</idle-timeout-seconds>
</entity-cache>
Para usarla, necesitamos definir una entidad de cach de nivel de aplicacin que se
define en el fichero weblogic-application.xml:
<weblogic-application>
<ejb>
<entity-cache>
<entity-cache-name>appLevelCache1</entity-cache-
name>
<max-beans-in-cache>1000</max-beans-in-cache>
<caching-strategy>MultiVersion</caching-strategy>
</entity-cache>
...
Pg. 61 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<weblogic-enterprise-bean>
<ejb-name>CorporateAddressRO</ejb-name>
<entity-descriptor>
<entity-cache-ref>
<entity-cache-name>appLevelCache1</entity-cache-
name>
<read-timeout-seconds>600</read-timeout-seconds>
<cache-between-transactions>true</cache-between-
transactions>
<concurrency-strategy>ReadOnly</concurrency-
strategy>
<estimated-bean-size>20</estimated-bean-size>
</entity-cache-ref>
...
Cache y transacciones
Si hacemos un llamada del contenedor para invocar al mtodo ejbLoad() por cada
transaccin simple, podemos encontrarnos con un problema de lentitud en el
procesamiento de stas.
Pg. 62 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<weblogic-enterprise-bean>
<ejb-name>AccountEJB</ejb-name>
<entity-descriptor>
<entity-cache>
<max-beans-in-cache>1000</max-beans-in-cache>
<cache-between-transactions>True
</cache-between-transactions>
</entity-cache>
<persistence></persistence>
</entity-descriptor>
<jndi-name>AccountEJB</jndi-name>
</weblogic-enterprise-bean>
Dado que mltiples clientes pueden acceder a un mismo entity bean de forma
concurrente, los servidores EJB deben dar soporte a niveles de concurrencia.
Exclusive
Database, por defecto
ReadOnly
Optimistic
En este caso de entity beans, los recursos sern tpicamente datos. Se puede dar una
situacin en que ms de un cliente est accediendo a la misma primary key a travs
del entity bean, y por tanto al mismo dato. Es lo que se llama un dirty read.
Estrategias de concurrencia
Exclusive
Establece un bloqueo exclusivo en instancias cacheadas de entity EJB cuando el
bean est asocidado a una transaccin.
Bloqueaa otras peticiones para la instancia EJB hasta que la transaccin se
completa.
Database
Aplaza el bloqueo de peticiones para un entity para la base de datos.
Distribuye una instancia separada de entity bean y permitir a la base de datos
manejar el bloqueo y el cacheo.
Pg. 63 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
ReadOnly
Activa un nueva instancia para cada transaccin, as las peticiones se procesan
de forma paralela para los entity beans.
Configura Weblogic Server para comprobar mediante un timeout de lectura y
si los datos de cach son ms antiguaos
Invalida los read-only beans cuando se llama al mtodo invalidate() y envia un
mensaje multicast a travs del cluster para invalidar las copias cacheadas en el
resto de nodos.
Optimistic
Los bloqueos no se mantienen en el contenedor EJB ni en la base de datos
durante una transaccin.
Pg. 64 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<weblogic-enterprise-bean>
<ejb-name>PurchaseOrderBean</ejb-name>
<entity-descriptor>
<entity-cache>
<concurrency-strategy>
Exclusive | Database | | Optimistic | ReadOnly
</concurrency-strategy>
</entity-cache>
</entity-descriptor>
</weblogic-enterprise-bean>
Existen situaciones donde mltiples instancias del mismo bean de entidad de tipo
CMP cambian en una misma transaccin. Si el contenedor EJB ejecuta sentencias
SQL/DML para todas las instancias de beans CMP, las actualizaciones pueden
convertirse en un cuello de botella en cuestiones de rendimiento.
Pg. 65 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Para permitir inserts, updates o deletes en modo batch en una base de datos, es
necesario habilitar el elemento enable-batch-operations del archivo weblogic-cmp-
jar.xml poniendolo al valor true tal como se muestra a continuacin:
<weblogic-rdbms-jar>
<enable-batch-operations>
True
</enable-batch-operations>
</weblogic-rdbms-jar>
Directiva include-updates
De acuerdo con la especificacin EJB, las actualizaciones hechas por una transaccin
deben ser reflejadas en los resultados de los query-finders y ejbSelects emitidos
durante la transaccin.
<weblogic-rdbms-jar>
<weblogic-query>
<query-method>
<method-name>findGoldCustomer</method-name>
<method-params>...</method-params>
</query-method>
<ejb-ql-query>...</ejb-ql-query>
<include-updates>True</include-updates>
</weblogic-query>
</weblogic-rdbms-jar>
Relationship caching usa joins multinivel para cargar mltiples beans usando
una sentencia SQL.
Pg. 66 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<weblogic-cmp-jar>
<relationship-caching>
<caching-name>cacheMoreBeans</caching-name>
<caching-element>
<cmr-field>accounts</cmr-field>
<group-name>acct_group</group-name>
<caching-element>
<cmr-field>address</cmr-field>
<group-name>addr_group</group-name>
</caching-element>
</caching-element>
<caching-element>
<cmr-field>phone</cmr-field>
<group-name>phone_group</group-name>
</caching-element>
</relationship-caching>
</weblogic-cmp-jar>
Campos de grupos
<weblogic-rdbms-bean>
<ejb-name>MedicalBean</ejb-name>
<field-group>
<group-name>medical-data</group-name>
<cmp-field>insurance</cmp-field>
<cmr-field>doctors</cmr-fields>
</field-group>
</weblogic-rdbms-bean>
Pg. 67 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Con CMT, se puede deciridr qu mtodos deben tener una transaccin activa
durante su ejecucin y el contenedor comenzar la transaccin antes de llamar al
mtodo y hacer commit o rollback de la transaccin una vez completado el mtodo.
Tag <container-transaction>
Este tag contiene, a su vez, los tags <method> y <trans-attribute>. El primero indica
el comportamiento que debe adoptar el contenedor cuando se llama a estos mtodos.
El segundo especifica uno o ms mtodos de un EJB.
...</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>JspSession</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
... </assembly-descriptor>
Pg. 68 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<ejb-name>
o Especifica el nombre del EJB que aloja el mtodo.
<method-intf>
o Es opcional y especifica la interfaz donde se ubican los mtodos. El valor
puede ser Home, Remote, Local LocalHome. Si se omite, los mtodos
de todas las interfaces deben especificarse.
<method-name>
o Es el nombre de un mtodo o *, que indica todos los mtodos.
<method-params>
o Es opcional y contiene una lista de tags <method-param>. Si mltiples
mtodos tienen el mismo nombre con diferentes parmetros, se puede
especificar el prototipo del mtodo.
o No se puede usar con *.
Cada valor indica el comportamiento que el contenedor debe adoptar cuando los
mtodos que generan, o estn expuestos a, transacciones son invocados. Cada
atributo indica qu hacer con una transaccin iniciada por un cliente y si debe
iniciarse una nueva transaccin.
Nivel de aislamiento
Pg. 69 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<weblogic-ejb-jar>
<transaction-isolation>
<isolationlevel>
TRANSACTION_READ_UNCOMMITTED</isolation-level>
<method> <ejb-name>dogEJB</ejb-name>
<method-name>*</method-name> </method>
</transaction-isolation>
</weblogic-ejb-jar>
Consideraciones de diseo
Timeout de transacciones
Veamos ahora las caractersticas del mecanismo de timeout dentro del control
transaccional:
Aseguran que las transacciones provocan bloqueos de filas en la base de datos del
menor tiempo posible.
Pg. 70 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<weblogic-enterprise-bean>
<transaction-descriptor>
<trans-timeout-seconds>20</trans-timeout-
seconds>
</transaction-descriptor >
</weblogic-enterprise-bean>
Pg. 71 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Sin embargo, es una buena prctica que todos los servidores que pertenecen a un
mismo cluster den los mismos servicios. De cara al cliente, el cluster aparece como
una nica instancia, ya sea el cliente un cliente Web una aplicacin Java. Al
replicar los servicios proporcionados por un servidor, este tipo de arquitecturas
construyen sistemas escalables y con tolerancia a fallos.
Balanceo de carga
Para conseguir una buena escalabilidad, cada servidor de un cluster debe usarse de
forma que se maximice su capacidad de uso. Dicho de otra manera, que sea usado
de forma completamente y de forma independiente y transparente al nmero de
componentes que lo formen. A este conjunto de tcnicas se recogen bajo el balanceo
de carga.
Si por el contrario, los servidores varan en potencia o en el tipo de servicios, hay que
especificar un algoritmo que tenga en cuenta estas diferencias.
Pg. 72 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Los clusters que usan un balanceo de carga hardware pueden usar cualquier
algoritmo de balanceo de carga soportado por el hardware.
Failover
Las instancias WebLogic Server son capaces de detectan fallos en el resto de los
miembros del clster gracias a una monitorizacin activa de cada uno de los
elementos que lo forman.
Pg. 73 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Los recursos en las redes de tipo MAN suelen esta en diferentes localizacin, pero lo
suficientemente cerca como para que la latencia de este tipo de redes sea un
problema a tener en cuenta.
Este tipo de redes suelen proveer servicios de alta velocidad y baja latencia, por lo
que los clsteres de Weblogic Server se pueden instalar sin mayores problemas en
este tipo de redes.
Balanceadores de carga
Bsicamente existen de dos tipos, hardware como los fabricados por Cisco, Foundry
Networks yBig IP, y los software, como Apache, Netscape, MS IIS o WebLogic
Server a travs de proxy plug-ins.
Passive cookie
Pg. 74 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Active cookie
Persistencia SSL
Replicacin de sesin
Componentes Web como servlets o pginas JSP mantienen datos de clientes en
instancias del objeto HttpSession. Por tanto, si deseamos tener la capacidad de alta
disponibilidad, esta informacin tiene que ser compartida por todos los nodos del
clster.
Para ello las instancias de HttpSession puede ser replicada a travs de la replicacin
en memoria o in-memory replication, persistencia en file system o persistencia en
base de datos
Pg. 75 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Una vez configurado, cada una de los managed server que forman el cluster usarn
la misma configuracin para crear el pool de conexiones que le permita acceder a la
informacin compartida por la base de datos.
En esta situacin, si por ejemplo, un servlet crea un objeto de sesin, ste almacena la
informacin en la base de datos. Las siguientes peticiones del cliente, sea al miembro
del clster que sea, podrn manejarse de igual forma, ya que todos tiene acceso a la
informacin almancenada.
Este mecanismo posee una mejor capacidad de failover dado que cualquier servidor
puede resolver y atender cualquier peticin desde los clientes, pero por el contrario,
tiene una reduccin significativa de rendimiento al tener que sincronizar cualquier
cambio con la base de datos.
<session-descriptor>
<persistent-store-type>replicated</persistent-store-type>
<session-descriptor>
<session-descriptor>
<persistent-store-type>replicated_if_clustered</persistent-
store-type>
<session-descriptor>
<session-descriptor>
<persistent-store-type>file</persistent-store-type>
<persistent-store-dir>Directory Path</persistent-store-dir>
<session-descriptor>
Pg. 76 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<session-descriptor>
<persistent-store-type>jdbc</persistent-store-type>
<persistent-store-pool>Data Source Name</persistent-store-
pool>
<session-descriptor>
Pg. 77 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
En este proceso, los queue monitor evalan la carga del sistema a travs del tiempo y
as como informacin histrica para ajustar el valor del nmero de hebras necesario,
incrementando o decrementando segn sea necesario de una forma totalmente
interna al pool de hebras.
Weblogic Server, por defecto, usa una nica cola de ejecucin basada en prioridades
donde todas las aplicaciones desplegadas tienen la misma prioridad de ejecucin.
Este work manager por defecto, llamado default work manager, puede
reconfigurarse creando y configurando un work manager global tambin llamado
defualt. En l, el tamao del pool de hebras puede ser configurado tanto es su lmite
mximo como en su lmite mnimo.
Las clases de tipo Request permite planificar el trabajo en base a la prioridad. Hay
que tener en cuenta que bsicamente existen dos componentes en un work manager:
las clases request y las restricciones (constraints). Pueden usarse cualquier de ellas
para controlar el rendimiento de una aplicacin referenciando el nombre del
componente en descriptor de despliegue. O bien puede crear un work manager que
encapsule estos componentes y referenciar a ste tambin en el descriptor de
despliegue.
Pg. 78 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Tal como hemos comentando en los work managers configurados como fair share, la
gestin se basa en prioridades. Y aunque todas las aplicaciones tiene por defecto la
misma prioridad, sta puede cambiarse de forma, que una aplicacin con un valor
para fair share de 1000, ser la que tenga la prioridad mas alta de todas las posibles.
fair-share-request-class>
<name>high_priority</name>
<fair-share>90</fair-share>
</fair-share-request-class>
<fair-share-request-class>
<name>low_priority</name>
<fair-share>10</fair-share>
</fair-share-request-class>
<response-time-request-class>
<name>fast_response_time</name>
<goal-ms>1000</goal-ms>
</response-time-request-class>
<response-time-request-class>
<name>slow_response_time</name>
<goal-ms>8000</goal-ms>
</response-time-request-class>
Este tipo de clases permite asignar una clases de tipo de request en base a una valor
de la peticin y/o a una propiedad de un role. Es decir, mapea el contenido con las
clase de tipo request que debe ejecutarse.
<context-request-class>
<name>simple_context</name>
Pg. 79 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<context-case>
<user-name>system</user-name>
<request-class-name>high_fairshare</request-class-name>
</context-case>
<context-case>
<group-name>everyone</group-name>
<request-class-name>low_fairshare</request-class-name>
</context-case>
</context-request-class>
Resctricciones (Constraints)
Las restricciones definen:
El valor mximo y mnimo de hebras que se crear para ejecutar las peticiones.
El nmero total de peticiones que encoladas antes de que Weblogic Server
comience a rechazas peticiones.
max-threads-constraint
min-threads-constraint
capacity
<max-threads-constraint>
<name>max_threads</name>
<count>10</count>
<connection-pool-name></connection-pool-name>
</max-threads-constraint>
<min-threads-constraint>
<name>min_threads</name>
Pg. 80 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<count>1</count>
</min-threads-constraint>
Resctriccin Capacity
Este tipo de restriccin permite que el servidor rechace peticiones en caso de que se
alcance el lmite de capacidad establecido para evitar la sobrecarga del sistema.
<capacity-constraint>
<name>my_capacity</name>
<count>50</count>
</capacity-constraint>
Es importante destacar, que las peticiones son rechazadas tanto si se alcanza el lmite
de forma individual como de forma global.
<work-manager>
<name>priority_work_manager</name>
<fair-share-request-class>
<name>very_high_priority</name>
<fair-share>1000</fair-share>
</fair-share-request-class>
<min-threads-constraint>
<name>min_five_Threads</name>
<count>5</count>
<min-threads-constraint>
</work-manager>
Este tipo de work managers, como su propio nombre indica, afecta a todos los
mdulos y aplicaciones desplegadas en el servidor, y pueden crearse tango con la
consola de administracin como directamente sobre el fichero config.xml.
<self-tuning>
<fair-share-request-class>
<name>HighFairShare</name> <target>mainserver</target>
<fair-share>500</fair-share>
</fair-share-request-class>
Pg. 81 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<max-threads-constraint>
<name>MoreThreads</name> <target>mainserver</target>
<count>20</count>
<connection-pool-name></connection-pool-name>
</max-threads-constraint>
<work-manager>
<name>priority_work_manager</name>
<target>mainserver</target>
<fair-share-request-class>HighFairShare</fair-share-
request-class>
<response-time-request-class xsi:nil="true"></response-
time-requestclass>
<context-request-class xsi:nil="true"></context-request-
class>
<max-threads-constraint>MoreThreads</max-threads-
constraint>
</work-manager>
</self-tuning>
Una vez creado, se debe crear al menos una clase de tipo request o una restriccin. A
partir de ese momento, el work manager las usar para priorizar la carga de trabajo.
Este tipo de work manager, aplican exclusivamente sobre las aplicaciones o modulos
a los que se le asocia a travs del fichero de despliegue weblogic-
application.xml tal como se indica a continuacin:
<weblogic-application>
<max-threads-constraint>
<name>app_max_threads</name>
<count>10</count>
</max-threads-constraint>
<min-threads-constraint>
<name>app_min_threads</name>
<count>5</count>
</min-threads-constraint>
<work-manager>
<name>AppScopedWorkManager</name>
</work-manager>
</weblogic-application>
<weblogic-web-app>
<wl-dispatch-policy>LowPriority</wl-dispatch-policy>
<work-manager>
<name>LowPriority</name>
<fair-share-request-class>
<name>LowFairShare</name>
<fair-share>50</fair-share>
</fair-share-request-class>
<max-threads-constraint>
Pg. 82 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
<name>LessThreads</name>
<count>2</count>
</max-threads-constraint>
</work-manager>
</weblogic-web-app>
Este tipo de work managers, de tipo Stuck Threads, se configuran para detener el
work manager en uso elimando todas las hebras siguiendo la parametrizacin que se
ndique, aunque tambin pueden usarse para prevenir la sobrecarga de los managed
servers.
Max Stuck Thread Time, es el nmero de segundos que una hebra debe trabajar
de forma continuada en la misma tarea antes de que el sistema la considere
bloqueada o en estado stuck.
Stuck Thread Count, es el nmero de hebras en estado stuck para que el servidor
sea transladado al estado FAILED.
<weblogic-web-app>
<wl-dispatch-policy>
stuckthread_workmanager
</wl-dispatch-policy>
<work-manager>
<name>stuckthread_workmanager</name>
<work-manager-shutdown-trigger>
<max-stuck-thread-time>60</max-stuck-thread-time>
<stuck-thread-count>5</stuck-thread-count>
</work-manager-shutdown-trigger>
</work-manager>
</weblogic-web-app>
Retrocompatibilidad
Pg. 83 / 84
InfV5_JASAS_WLS_BusinessLayer_BestPractices_V310.doc, Ver. 3.1.0
12 de enero de 2012
Para que ello sea posible, es necesario realizar uno de los dos cambios siguientes:
Pg. 84 / 84