29.1.09

Manipulacion de XMLs directamente desde el MSSQL Server

Por si a alguien le interesa el tema de la manipulacion de XMLs directamente desde el servidor MSSQL Server

Ire publicando aqui varios ejemplos

1er Ejemplo : Consulta de un xml y uso de la sentencia WHERE

DECLARE @LISTA1 VARCHAR(MAX)

SET @LISTA1 =

N'<>

< valor="1">

< valor="2">

< valor="3">

< /LISTA1 >'

  • Arriba creamos un XML de ejemplo con elemento principal LISTA1 y varios ELEMENTOs y procederemos a declarar el Objeto que amlacenara este TEXTO y para ello usaremos el objeto o tipo de dato XML que viene en el SQLServer

DECLARE @XMLLIST1 XML

  • Le asignamos el contenido de la variable @LISTA1 al tipo XML previamente creado , objeto que sera el que nos permita manipular el texto de una mejor manera

SET @XMLLIST1 = @LISTA1

  • A continuacion hacemos un SELECT siemple que nos devuelve todos los ELEMENTOs que hay en el XML, notar que en la sentencia de abajo hay dos barras delante de ELEMENTO, esto indica que queremos realizar la consulta de todos los //ELEMENTO que existen sin importar el nivel en el que se encuentre

SELECT Elemento = T.Item.value('@VALOR', 'varchar(25)')

FROM @XMLLIST1.nodes('//ELEMENTO') AS T(item)

  • Ahora supongamos que solo queremos mostrar el ELEMENTO con valor 1 , para ello tendriamos que añadir la siguiente linea

WHERE T.Item.value('@VALOR', 'varchar(25)') = 1

  • Donde el signo indica que nos referimos a un atributo dentro de ELEMENTO, como se puede apreciar tuvimos que volver a declarar el @VALOR , y si tuvieramos 5 atributos que filtrar deberia hacer esto por cada uno de los cinco , por eso recomiendo hacer lo siguiente para que asi sea mas facil la manipulacion del xml

SELECT *

FROM (

SELECT Elemento = T.Item.value('@VALOR', 'varchar(25)')

FROM @XMLLIST1.nodes('//ELEMENTO') AS T(item)

)LISTA1

WHERE ELEMENTO = 1

  • Asi de esta manera los campos que se hayan declarado en el interior del FROM pues sera mucho mas facil usarlos desde fuera ya que solo los llamaremos por su nombre y no asi por la declaracion XML : T.Item.value('@VALOR', 'varchar(25)')

 

13.1.09

Iniciar/Detener/Reiniciar una aplicación web en Glassfish remotamente mediante JMX

Saludos y buen dia...


EL titulo creo que es mas que sugerente sino deja que te lo cuente :P


Resulta que glassfish como sabras es un "servidor de aplicaciones" y puedes tener varias de estas alojadas sobre un mismo dominio (no el DNS). Pero hay monentos en que estas en el periodo de desarrollo y tienes un servidor centralizado donde cada programador despliega alli su proyecto o aplicacion web, hasta aqui no hay nada que contar.... pero resulta que tu aplicacion por x motivo puede fallar, ya sea porque te dio un error desastroso la persistencia o cualquier otro y para dejarla disponible necesitaras reiniciar el glassfish para las pruebas que vayas haciendo ya que no es un error o actualizacion que necesites reinstalarla o desplegarla nuevamente simplemente necesitas reiniciarla, normalmente con un simple reinicio del glassfish se solucionaria el problema pero al ser un servidor centralizado de desarrollo es realmente molesto y hasta cansino el tener que avisar a cada uno de los programadores que vas a reinciar su entorno de pruebas solo para resolver un problema tuyo con las conocidas molestias que esto puede causar, vamos que uno que lleva un rato probando la migracion de datos y venga uno y le diga "eh que reinicio la cosa esta y lo que estes haciendo pues....." y todo el trabajo hecho a la mier.... solo porque hace falta que se reinicie el glassfish para poder dejar funcionando otra aplicacion en el servidor.......... y no solo en estos casos de desarrollo sino tambien en casos en que las aplicaciones esten en produccion y haya que reiniciar una de ellas para que sea aplicable un cambio de configuracion X.


Creo que han pillado la idea, asi que sin rodeos empecemos nuevamente :P :D


Este tema surge debido a que tendremos varios proyectos desplegados sobre el mismo servidor de aplicaciones y hay momentos en que es necesario reiniciar el proyecto que tengamos para que se apliquen los cambios en la configuracion u otros, si tuvieramos solo una aplicacion en el servidor no habria problemas pero cuando hay varias que esten en produccion el detener todo el servidor solo para actualizar una, penalizaria la disponibilidad de las otras aplicaciones lo cual segun que proyectos no sera nada aconsejable por la necesidad que tendran de estar siempre disponibles por eso el encontrar  una solucion de como reiniciar una aplicacion sin necesidad entonces de reiniciar las otras que no lo necesiten era necesario.



La via mas rapida encontrada fue utilizar el servicio JMX(Java Management Extensions) que se inicia con el glassfish y usando JConsole conectarnos remotamente para asi poder realizar la operacion necesaria.
El JConsole normalmente viene con el java
Los pasos para reiniciar una aplicacion web desplegada en glassfish serian:
  • Abrimos el JConsole y nos saldra una ventana para realizar una coneccion. Seleccionamos "Remote Process" y alli utilizamos la siguiente url de conexion:
service:jmx:rmi:///jndi/rmi://HOSTNAME:PORT/jmxrmi
donde HOSTNAME sera el nombre el servidor o el ip del mismo y PORT , sera el utilzado por el servicio jmx, normalmente el 8686
  • Una vez conectados vamos a la pestaña MBeans(Appserver Management Extensions)
  • En el arbol que sale buscamos amx/WebModule/null/server/
  • Estando alli escogemos la applicacion web que queremos reiniciar teniendo en cuenta el siguiente formato para el nombre
    //server/NOMBREDEAPLICACIONWEB
  • Expandemos las opciones para esta aplicacion web seleccionada y vamos a Operations y las expandimos, podremos ver entonces dos opciones , la lista expandida de las operaciones o en la parte derecha salen un poco mas visual, vamos de solo "click y ya esta"
Con las que vamos a jugar son con Stop() , Start() y Reload(). Estas son las que detienen la aplicacion web y la inician.
Cuando ejecutemos el metodo Stop() en el servidor glassfish deberiamos ver un mensaje como el siguiente : PWC1240: No se ha iniciado el contenedorWebModule? [/SercotelConectorNfactorial]
y cuando ejecutemos el metodo Start() deberiamos ver el siguiente mensaje : :S No me salio ningun mensaje del tipo "se ha iniciado" debo indagar un poco mas :P , si le vuelvo a decir Start() me sale un mensaje del tipo : PWC1238: Ya se ha iniciado el contenedor WebModule? [/SercotelConectorNfactorial]
y si le damos el Reload() sale un mensaje parecido a este: PWC1294: Se ha iniciado la recarga de este contexto

Y pues esto es lo que necesitariamos para poder reiniciar solo una aplicacion web desplegada en glassfish sin que afecte a las demas.

Sin mas....
Me despido deseandoles buena suerte a todos

Creative Commons License This page is powered by Blogger. Isn't yours?