Este es una ejemplo que me ha parecido muy útil y sencillo realizado por, Bassem Zohdy , un miembro la comunidad Spring en Linkedin.
Lo tiene muy bien explicado en un vídeo que os pongo a continuación y el código en github, que también os pongo. Además su inglés se entiende muy fácilmente.
Código fuente en github
Translate
domingo, 9 de febrero de 2014
sábado, 1 de febrero de 2014
Weblogic: supervisión de rendimiento del Pool de conexiones
Una de las características que más me gustan de servidor de aplicaciones Weblogic es toda la gama de menús y opciones de supervisión de que tiene.
En mi caso he tenido que utilizar varias veces los elementos de supervisión para solucionar varios problemas de rendimiento que se producían en la aplicación.
Supervisión del Pool de conexiones:
Para acceder a la supervisión del pool de conexiones del dominios de tu servidor Weblogic 11g tenemos que acceder de la siguiente manera.
Entramos en la consola de administración de nuestro servidor:
http://127.0.0.1:7001/console
Y en la estructura de dominio pulsamos en Entorno>>Servidores
Y seleccionamos el servidor que queremos supervisar en nuestro caso AdminServer
Después vamos a la pestaña de supervisión>>JDBC y selecciona el pool de conexiones que queremos supervisar
Seleccionamos el pool de conexiones y vemos toda la información que Weblogic nos da:
Hay muchos más pero los más relevantes para mi han sido los que vemos en la imagen.
El valor más importante es el Recuento Actual de conexiones activas, que son las conexiones que hay activas en el servidor en este momento. Este valor tendrá que ser 0 al final de hacer test de stress a nuestro servidor donde realizamos pruebas a nuestra aplicación cargándola con multiples peticiones concurrentes que accedan a base de datos. Si el valor fuera distinto de 0 es que las conexiones que hemos pedido la pool de conexiones no se han cerrado correctamente y eso es un grave problema.
Otro valor importante es el Recuento total de esperas de conexión que nos indica que la aplicación ha solicitado una conexión al pool y no tenía conexiones disponibles y ha tenido que esperar para conseguir una conexión libre del pool.
Por último otro valor interesante el Total de Fallos de esperas de conexión, este valor quiere decir que alguna de las solicitudes de conexión anteriores no obtuvo una conexión en el tiempo requerido y dió un error de timeOut porque no había nunguna conexión disponible. Esto quiere decir que nuestro sistema estaba muy cargado y no fue capaz de responder a tantas peticiones.
En mi caso he tenido que utilizar varias veces los elementos de supervisión para solucionar varios problemas de rendimiento que se producían en la aplicación.
Supervisión del Pool de conexiones:
Para acceder a la supervisión del pool de conexiones del dominios de tu servidor Weblogic 11g tenemos que acceder de la siguiente manera.
Entramos en la consola de administración de nuestro servidor:
http://127.0.0.1:7001/console
Y en la estructura de dominio pulsamos en Entorno>>Servidores
Y seleccionamos el servidor que queremos supervisar en nuestro caso AdminServer
Después vamos a la pestaña de supervisión>>JDBC y selecciona el pool de conexiones que queremos supervisar
Seleccionamos el pool de conexiones y vemos toda la información que Weblogic nos da:
Hay muchos más pero los más relevantes para mi han sido los que vemos en la imagen.
El valor más importante es el Recuento Actual de conexiones activas, que son las conexiones que hay activas en el servidor en este momento. Este valor tendrá que ser 0 al final de hacer test de stress a nuestro servidor donde realizamos pruebas a nuestra aplicación cargándola con multiples peticiones concurrentes que accedan a base de datos. Si el valor fuera distinto de 0 es que las conexiones que hemos pedido la pool de conexiones no se han cerrado correctamente y eso es un grave problema.
Otro valor importante es el Recuento total de esperas de conexión que nos indica que la aplicación ha solicitado una conexión al pool y no tenía conexiones disponibles y ha tenido que esperar para conseguir una conexión libre del pool.
Por último otro valor interesante el Total de Fallos de esperas de conexión, este valor quiere decir que alguna de las solicitudes de conexión anteriores no obtuvo una conexión en el tiempo requerido y dió un error de timeOut porque no había nunguna conexión disponible. Esto quiere decir que nuestro sistema estaba muy cargado y no fue capaz de responder a tantas peticiones.
martes, 7 de enero de 2014
Oracle JDBC: Como usar una secuencia en un INSERT y recuperar el valor generado
La problemática de hoy surge cuando tengo que hacer un INSERT en mi tabla de notificaciones y necesito que la clave primaria de mi notificación se una valor único.
Lo primero que se te ocurre y en lo que puedes caer en la tentación es en coger el valor más alto de las que ya hay insertadas y sumarle 1.
Pero inmediatamente te das cuenta de que eso puede llevar a conflictos si hay muchas inserciones a la vez y alguno puede duplicar la clave.
Así que lo mejor es crear una secuencia en Oracle y usarla en nuestro INSERT.
Con TOAD podemos crear una secuencia fácilmente llamada NOTIF_ID_SEQ con los siguientes parámetros
Y utilizar la en nuestra INSERT llamando al operador NOTIF_ID_SEQ.nextval
Con esto garantizamos que el valor de nuestro identificador es único y es el dado por nuestra secuencia.
Otra problemática que nos surge inmediatamente en esta casuistica es que podemos querer recuperar el valor generado por la secuencia para usarlo en otro lugar.
Para ello utilizamos el método getGeneratedKeys() del PrepareStatement pero debemos decirle al PreparedStatement que columnas son las que se autogeneran en un Array de Strings en nuestro caso "NOTIF_ID"
Veamos un ejemplo:
Referencias:
how to get the inserted row primary key with out using select statement
getGeneratedKeys()
How to use Oracle sequence in preparedstatement
Oracle Java JDBC: Get Primary Key Of Inserted Record
Lo primero que se te ocurre y en lo que puedes caer en la tentación es en coger el valor más alto de las que ya hay insertadas y sumarle 1.
String strSQL="select max(notif_id) from notifications"; pstmt = conn.prepareStatement(strSQL); ResultSet rs = pstmt.executeQuery(); int uniqueId = (rs!=null && rs.next())?rs.getInt(1)+1:0;
Pero inmediatamente te das cuenta de que eso puede llevar a conflictos si hay muchas inserciones a la vez y alguno puede duplicar la clave.
Así que lo mejor es crear una secuencia en Oracle y usarla en nuestro INSERT.
Con TOAD podemos crear una secuencia fácilmente llamada NOTIF_ID_SEQ con los siguientes parámetros
Y utilizar la en nuestra INSERT llamando al operador NOTIF_ID_SEQ.nextval
String strSQL="insert INTO NOTIFICATIONS " +
"(USER_ID,PROVIDER_ID,NOTIF_ID) " +
"VALUES (?,?,NOTIF_ID_SEQ.nextval)";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, userId);
pstmt.setInt(2, providerId);
pstmt.executeUpdate();
Con esto garantizamos que el valor de nuestro identificador es único y es el dado por nuestra secuencia.
Otra problemática que nos surge inmediatamente en esta casuistica es que podemos querer recuperar el valor generado por la secuencia para usarlo en otro lugar.
Para ello utilizamos el método getGeneratedKeys() del PrepareStatement pero debemos decirle al PreparedStatement que columnas son las que se autogeneran en un Array de Strings en nuestro caso "NOTIF_ID"
Veamos un ejemplo:
String generatedColumns[] = {"NOTIF_ID"};
pstmt = conn.prepareStatement(strSQL,generatedColumns);
String strSQL="insert INTO NOTIFICATIONS " +
"(USER_ID,PROVIDER_ID,NOTIF_ID) " +
"VALUES (?,?,NOTIF_ID_SEQ.nextval)";
pstmt = conn.prepareStatement(strSQL);
pstmt.setString(1, userId);
pstmt.setInt(2, providerId);
pstmt.executeUpdate();
//Get the generated key
ResultSet generatedKeys = pstmt.getGeneratedKeys();
if (null != generatedKeys && generatedKeys.next()) {
int primaryKey = generatedKeys.getInt(1);
System.out.println(primaryKey);
}
Referencias:
how to get the inserted row primary key with out using select statement
getGeneratedKeys()
How to use Oracle sequence in preparedstatement
Oracle Java JDBC: Get Primary Key Of Inserted Record
Suscribirse a:
Entradas (Atom)
