Friday, October 9, 2009

LIBERACIÓN DE MEMORIA CON JAVA Y EL GARBAGE COLECTOR

Estudiando un día mi libro de certificación llegue al tema del manejo del Garbage Colector en JAVA y encontré temas muy importantes e interesantes que no sabía como que el Garbage Colector uno no puede ser forzado a pasar y liberar memoria, sino que cuando uno cuando en su aplicación genera X procesos que son muy pesados la memoria puede incrementarse a tal punto que le puede aparecer una Excepcion [java.lang.OutOfMemoryError] refiriéndose que ya no hay memoria suficiente y automaticamente tu aplicación se cuelga, para ello este método que acontinuación implemento puede ser llamado. Dicho ejemplo muestra un simple Test, en el que se imprime el total de memoria que se maneja al inicio, el total de memoria libre que queda luego de ejecutar un 'For' GIGANTE y el total de memoria que queda luego de ejecutar el método de liberacion de memoria que hace una solicitud a la JVM, para que el Garbage Colector pase:


import java.sql.Date;

/**
* @author: Ricardo Guerra.
* @clase: TestGarbageColector.java
* @descripción: Clase utilizada para probar el manejo del Garbage Colector en casos que las aplicaciones
* consuman mucha memoria.
* @author_web: http://frameworksjava2008.blogspot.com
* http://viviendoconjavaynomoririntentandolo.blogspot.com
* @author_email: cesarricardo_guerra19@hotmail.com.
* @fecha_de_creación: 05-08-2009.
* @fecha_de_ultima_actualización: 20-03-2009.
* @versión: 1.0
*/
public class TestGarbageColector{

/**
* @param args
*/
public static void main( String[] args ){
TestGarbageColector test = new TestGarbageColector();
test.testGarbageColector();
}

/**
* testGarbageColector Método que prueba un incremento de memoria para ver el manejo de la
* liveracion de esta al solicitar a la 'JVM' el 'GC'.
*/
public void testGarbageColector(){

Date fecha = null;

for( int i=0; i<1000000; i++) {
fecha = new Date( 10, 10, 2009 );
fecha = null;
}

//Solicitamos a la 'JVM' el 'GC', para liverar memoria.
this.getSolicitaGarbageColector();
}

/**
* getSolicitaGarbageColector Método que invoca al Garbage Colector( NO LO FUERZA a venir,
* envia una solicitud a la JVM para su proceso..!!! )
*
*/
public void getSolicitaGarbageColector(){

try{
System.out.println( "********** INICIO: 'LIMPIEZA GARBAGE COLECTOR' **********" );
Runtime basurero = Runtime.getRuntime();
System.out.println( "MEMORIA TOTAL 'JVM': " + basurero.totalMemory() );
System.out.println( "MEMORIA [FREE] 'JVM' [ANTES]: " + basurero.freeMemory() );
basurero.gc(); //Solicitando ...
System.out.println( "MEMORIA [FREE] 'JVM' [DESPUES]: " + basurero.freeMemory() );
System.out.println( "********** FIN: 'LIMPIEZA GARBAGE COLECTOR' **********" );
}
catch( Exception e ){
e.printStackTrace();
}
}
}


El resultado en CONSOLA obtenido es el siguiente:


********** INICIO: 'LIMPIEZA GARBAGE COLECTOR' **********
MEMORIA TOTAL 'JVM': 4194304
MEMORIA [FREE] 'JVM' [ANTES]: 1137312
MEMORIA [FREE] 'JVM' [DESPUES]: 3749208
************ FIN: 'LIMPIEZA GARBAGE COLECTOR' ***********

Thursday, October 8, 2009

DBHelper v2.0

Pensando en los diferentes problemas de sintaxis que a diario se presentan cuando uno trabaja en el Àrea de Sistemas como: P, AP, DBA en la creaciòn y manipulaciòn de datos en diferentes Motores de Datos, creè DBHelper v2.0.

DBHelper v2.0 es una aplicación hecha en JAVA SWING con la finalidad de brindar ayuda a los desarrolladores, DBA's, etc. en lo que respecta a la sintaxis para la construcción de:

Stores Procedure, Fuction, View, Trigger, Package, Sequence.

En los diferentes y muy conocidos Motores de Datos:

Oracle, MySql, Postgres, SqlServer.

Ya que dicha sintaxis varìa según el Motor de Datos utilizado, en lo que respecta a delaraciòn de variables, nombres de funciones internas, asignaciones, etc. Ya que todos los Motores de Datos estàn orientados a un mismo Lenguaje de Programaciòn como base que es el SQL y de ese ya nacen los personalizados que varian un poco como son:

PLSQL, TRANSACSQL, PGSQL, etc.

DB_JavaHelper esta orientado a ayudar en lo que a sintaxis por Motor de Datos respecta y muestra tambien como probar cada uno, dando una plantilla base para cada Motor de Datos para cada procediento a realizar.



Requisitos Previos: DB_JavaHelper, esta creado para trabajar con JAVA 1.6 y es IMPORTANTE el NO cambiar los nombres de las carpetas y ejecutables encontrados dentro del comprimido. Simplemente se descomprime el .zip, se guarda un una ruta respectiva y se crea un acceso directo al ejecutable (DB_JavaHelper.jar).

- NOMBRE CARPETA RAIZ = DB_JavaHelper
- NOMBRE CARPETA_SCRIPT = Script
- NOMBRE EJECUTABLE = DB_JavaHelper.jar

Desde DB_JavaHelper tambien se puede descargar los Script por BD, los cuales sirvieron de base para las plantillas mostradas en los ejemplos.

Para descargar DB_JavaHelper pulsar:
AQUÌ.


Sunday, September 13, 2009

Acceso a Recursos desde un aplicaciòn Java J2SE

Normalmente cuando desarrollamos una aplicaciòn JAVA desktop en SWING o AWT hay inconvenientes para poder acceder a las imagenes, ficheros, etc.

La soluciòn es la que se muestra en la gràfica.


Se tendrìa que crear un SourceFolder llamado Imagenes, en donde se crearia un paquete que contenga una ruta similar a la mostrada y que dentro estarìan: imagenes, ficheros, etc. Estos recursos serìan accedidos y reconocidos facilmente codificando desde tu clase JAVA de la siguiente manera.

URL url_lmagen = ClassLoader.getSystemResource( org\\formatos\\jpg\\Nombre_Imagen.jpg );

Monday, August 31, 2009

Multiconexiones JDBC

Las clases conexion en una aplicacion JAVA es la clave para que tu aplicacion JAVA acceda y se conecte a un servidor de base de datos. Para ello se realiza clases que mediante Driver JDBC se conectan. Muchas veces los desarrolladores caen en la necesidad de crear muchas conexiones que se encuentran regadas en difrentes partes de la aplicacion, esto en realidad no es lo optimo pero se hace muchas veces. Lo mejor es tener una clase que administre las conexiones a las base de datos. El ejemplo que mostraremos continuacion realiza esto y mucho mas. Este consta que un ECLIPSE Dinamic Project que posee un paquete de conexion (org.java.conexion), que maneja administra las conexiones a diferentes motores de datos SIMULTANEAMENTE( MySql, SqlServer, Oracle, Postgres ). Simplemente con cambiar un parametro en el fichero .properties.

Dentro de la aplicacion se encontrarà todas las librerias JDBC necesarias y tambien se encontrara el fichero ScriptBD.txt con los script de prueba para cada motor de datos.


Para descargar la aplicacion demo de multiconexiones JDBC pulsar AQUI.

CONFIGURACION JDBC PARA SQL SERVER 2005 EXPRESS

En esta oportunidad mostrae la configuración para crear una conexión JDBC entre una aplicación JAVA con el respectivo servidor SQL Server 2005 Express.

Los requerimientos previos y el software necesario son los siguientes:

Requerimientos Previos:>

- NetFramework v4.0.exe (DESCARGAR.)
- Windows Installer v4.5.exe (DESCARGAR.)

Herramienta SQL Sever (DESCARGAR AMBOS.):

- SQL Server 2005 Express.exe.
- SQL Server Manager Studio 2005 Express.msi

Para acceder a este motor de datos vía una aplicación JAVA JDBC, se debe de realizar lo siguiente:

Descargar los drivers de conexión desde AQUI.:

- sqljdbc.jar
- sqljdbc4.jar
- mssqlserver.jar
- msbase.jar
- msutil.jar
- jtds-1.2.2.jar

Acceder a tu herramienta de desarrollo ECLIPSE y crear un proyecto Dinamic Web y en la carpeta lib ingresar los .Jars de conexión descargados. Luego, creamos una clase .java para la conexión con los motores de datos SQL Server 2000 y SQL Server 2005, aquí comparto mi clase que desarrolle:

package org.java;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.ResultSet;

public class ConexionSQLServeJDBC{

private Connection conexion = null;
private final String url = "jdbc:microsoft:sqlserver://";
private final String servidor = "localhost\\SQLEXPRESS";
//"192.168.1.33"; //"LOCALHOST"; //"LOCALHOST\\SQLEXPRESS SQLSERVER2000";
private final String puerto = "1433";
private final String baseDatos = "DEMODB";
private final String usuario = "sa";
private final String password = "sql";
private final String metodo = "cursor"; //direct - cursor;

//Constructor.
public ConexionSQLServeJDBC(){
}

//Levanta la Aplicacion.
public static void main( String[] args ) throws Exception{
ConexionSQLServeJDBC conexionJDBC = new ConexionSQLServeJDBC();
conexionJDBC.propiedadesDataBase();
}
/**
* getConnectionUrl
* @return String
*/
private String getConnectionUrl(){

/*
* El driver de Microsoft NO funciona con "servidor\instancia". Para solucionar el
* tema, debes indicar la direccion IP del servidor + el puerto de la instancia.
*/

//String SQL = ( this.url + this.servidor + ":" + this.puerto + ";databaseName=" + this.baseDatos + ";" + "selectMethod=" + this.metodo + ";" );

String SQL = ( this.url + this.servidor + ":" + this.puerto + ";databaseName=" + this.baseDatos + ";" );

System.out.println( "Cadena CONEXION JDBC: " + SQL );

return SQL;
}
/**
* getConnection
* @return Connection
*/
private Connection getConnection(){
try{
Class.forName( "com.microsoft.jdbc.sqlserver.SQLServerDriver" );
this.conexion = java.sql.DriverManager.getConnection( this.getConnectionUrl(), this.usuario, this.password );

if( this.conexion != null ){
System.out.println( "Conexión .... OK" );
}
else{
System.out.println( "Conexión .... NOK" );
}
}
catch( Exception e ){
e.printStackTrace();
System.out.println( "Error de seguimiento en 'getConnection()': " + e.getMessage() );
}
return this.conexion;
}

/**
* propiedadesDataBase
*/
public void propiedadesDataBase(){

DatabaseMetaData metaData = null;
ResultSet rs = null;
int contador = 0;

try{
this.conexion = this.getConnection();

if( this.conexion != null ){
metaData = this.conexion.getMetaData();

System.out.println( "" );
System.out.println( "****** INFORMACION DEL CONTROLADOR JDBC ******" );
System.out.println( " - NOMBRE: " + metaData.getDriverName() );
System.out.println( " - VERSION: " + metaData.getDriverVersion() );
System.out.println( "" );
System.out.println( "****** INFORMACION DE BASE DE DATOS ******" );
System.out.println( " - NOMBRE: " + metaData.getDatabaseProductName() );
System.out.println( " - VERSION: "+ metaData.getDatabaseProductVersion() );
System.out.println( "" );
System.out.println( " - BASES DE DATOS ACTIVAS: " );

rs = metaData.getCatalogs();

while( rs.next() ){
contador += 1;
System.out.println( " BD #" + contador + ": " + rs.getString( 1 )
);
}
this.cerrarConexiones( this.conexion, rs );
}
else{
System.out.println( "Error: No hay ninguna Conexión SQL Activa" );
}
}
catch( Exception e ){
e.printStackTrace();
}
}
/**
* cerrarConexiones
* @param conexion
* @param rs
*/
private void cerrarConexiones( Connection conexion, ResultSet rs ){
try{
if( conexion != null ){
conexion.close();
}
if( rs != null ){
rs.close();
}
}
catch( Exception e ){
e.printStackTrace();
}
}
}

Thursday, July 23, 2009

Sintaxis JAVA & JAVADOC 'Standar'

El otro día indagando en las opciones de esta maravillosa Ide de desarrollo que es el Eclipse v3.3, ya que por lo que conozco se que es, en la mayoría de sus opciones, personalizadle, la solución para aplicar un forma estándar en lo que respecta la creación de mis métodos, clases, declaraciones, iteradores, etc. Cuando digo aplicar un estándar me refiero a una sintaxis personalizada (espacios entre declaración y variable, distancia entre métodos y declaraciones, la llaves estén pegadas o no pegadas a la clase o método, etc. ) y al igual que para las sintaxis netamente de la programacion de JAVA, necesitaba una para ya no están creando los JAVADOC para cada método o get y set, etc. Buscando la solución la encontré Eclipse tiene opciones para la personalización de todo esto que he hablado, simplemente entrando a:
(Windows/Preferences/Java/Code Style).

Dentro encontraran estas 2 opciones:

I.- Code Formatter (o Formatter):
En esta opciones uno puede crear un perfil de formato, que quedara registrado en el comboBox y que dentro de dicho perfil se crearan desde una interfase a base de taps toda la personalización en cuando al código de programación que desees para luego guardar en un XML todos tu profile. También permite la importación de un XML que anteriormente hayas guardado.

II.- Code Template:
En esta opciones uno puede importar un XML donde se encuentre personalizado todo los JAVADOC, para cada caso que se indica en las opciones Commets y Code.

La funcionalidad esta para la sintaxis JAVA es aplicada cuando generes código o crees clases, etc. utilizando la herramienta (ECLIPSE) misma o sino cuando pegues en el paquete una clase externa o código externo y simplemente pulsado:
(Crtl + Shift + F), todo el código será transformado según la sintaxis que hayas definido en tu XML importado o creado.

Aquí muestro dos imágenes, una de cada opción:

Code Formatter (ó Formatter)


Code Template


Para mayor detalle descargar los 'XML' con los Standares aplicados y listos para ser importados pulsando: AQUI.

Tuesday, June 2, 2009

Eclipse ShortCuts

Tratando de tener un mejor y màs manejo de esta excelente IDE de desarrollo. Posteo en esta oportunidad la lista de ShortCuts que maneja Eclipse junto con todas las demas IDEs màs potentes como WebsPhere, Red Hat Developer Studio, MyEclipse, JBoss Developer Studio, Etc. Ya que poseen como base a Eclipse. La lista de Eclipse ShortCuts es:

Explicaciòn.