Vamos por ejemplo a crear un hilo para hacer una importación de datos a la base de datos.
Vamos a imaginarnos un proyecto en el que tenemos un enlace llamado "Importar Datos" al pinchar sobre se no va a un método que su código seria seria similar al siguiente:
public String actionImportarDatos(){
Thread hilo = new Thread() {
public void run() {
******* lineas de código para la inserción de datos ***********
}
};
hilo.start();
return null;
}
Esto nos servirá por ejemplo si después de pulsar el enlace queremos seguir navegando por la aplicación sin que se interrumpa la importación de datos.
martes, 17 de noviembre de 2009
Datamart
Un datamart es una base de datos con muchísimos datos al cual puedo realizar consultas rápidamente
Un datamart es un DataWarehouse a un nivel más pequeño.
Un datamart tendrá tablas llamadas DIMENSIONES y otras tablas llamadas de HECHO o FACT TABLE, estas tablas tendrán todas las combinaciones posibles de dichas DIMENSIONES.
También tendremos tablas detalles estas tablas son por ejemplo, tengo una tabla llamada empresa, otra tabla llamada datos personales y en empresa hay un id que hace referencia a datos personales, pues unimos estas dos tablas en una y será la de detalles.
La tabla de HECHO también llamada agregada, es la tabla central de un sistema dimensional. Esta tabla es final no se puede crear mas a partir de ella.Esta tablas su claves serna los id relaciones con las tablas que estan relacionadas.
Por ejemplo tengo una tabla empresas, otra operaciones, otra provincia, otra clientes pues la tabla hecho seria una tabla con los id de cada tabla mas alguno campos necesarios dependiendo de lo que queramos mostrar. Serán datos numéricos que se pueden resumir para proporcionar información sobre el historial de las operaciones de la organización.
Un datamart es un DataWarehouse a un nivel más pequeño.
Un datamart tendrá tablas llamadas DIMENSIONES y otras tablas llamadas de HECHO o FACT TABLE, estas tablas tendrán todas las combinaciones posibles de dichas DIMENSIONES.
También tendremos tablas detalles estas tablas son por ejemplo, tengo una tabla llamada empresa, otra tabla llamada datos personales y en empresa hay un id que hace referencia a datos personales, pues unimos estas dos tablas en una y será la de detalles.
La tabla de HECHO también llamada agregada, es la tabla central de un sistema dimensional. Esta tabla es final no se puede crear mas a partir de ella.Esta tablas su claves serna los id relaciones con las tablas que estan relacionadas.
Por ejemplo tengo una tabla empresas, otra operaciones, otra provincia, otra clientes pues la tabla hecho seria una tabla con los id de cada tabla mas alguno campos necesarios dependiendo de lo que queramos mostrar. Serán datos numéricos que se pueden resumir para proporcionar información sobre el historial de las operaciones de la organización.
Modificar nombre y tipo de una columna
Para modificar el nombre y el tipo utilizamos la siguiente instrucción:
ALTER TABLE nombre_tabla RENAME COLUMN columna_antigua TO columna_nueva;
ALTER TABLE nombre_tabla MODIFY columna tipo_nuevo;
ALTER TABLE nombre_tabla RENAME COLUMN columna_antigua TO columna_nueva;
ALTER TABLE nombre_tabla MODIFY columna tipo_nuevo;
viernes, 13 de noviembre de 2009
Dependencias de un jar
He necesitado una librería nueva en mi proyecto, pero para meterla en el pom.xml necesitaba saber el groupId,artifactId.
Para ello me he descargado la librería la he descomprimido, he entrado en la carpeta META-INF/MANIFEST.MF.
Lo abrimos , abrimos un navegador y entramos en esta dirección http://mvnrepository.com, aquí buscamos la librería , entramos dentro y comparamos los manifiest y vemos que tienen el mismo tamaño y las mismas cosas, si copiamos el codigo con groupId,artifactId que no viene en esa página en nuestro pom.xml ,hacemos maven para que se la descargue y ya tenemos nuestra librería en el proyecto.
Para ello me he descargado la librería la he descomprimido, he entrado en la carpeta META-INF/MANIFEST.MF.
Lo abrimos , abrimos un navegador y entramos en esta dirección http://mvnrepository.com, aquí buscamos la librería , entramos dentro y comparamos los manifiest y vemos que tienen el mismo tamaño y las mismas cosas, si copiamos el codigo con groupId,artifactId que no viene en esa página en nuestro pom.xml ,hacemos maven para que se la descargue y ya tenemos nuestra librería en el proyecto.
miércoles, 11 de noviembre de 2009
Crear una tarea a una hora determinada
Para ello vamos a utilizar la clase java.util.TimerTasK y Timer.
La clase TimerTask tiene un metodo run que es como los Thread, lo que contiene el metodo run es lo que se va a ejecutar cada cierto periodo.
La clase Timer la utilizamos para para programar tareas para ejecutar en el futuro en un hilo de fondo. Las tareas se pueden programar para un tiempo de ejecución, o para la ejecución repetida a intervalos regulares.
En mi proyecto lo he colocado en la clase que arranca el proyecto, dentro de esa clase me he creado un clase interna:
class ImportarDatos extends TimerTask {
public void run() {
//// Damos baja prioridad al hilo
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
*********************tareas a realizar*****************************
}
Y dentro de la clase del listener me he creado lo siguiente:
System.out.println("*************************************");
System.out.println("* Iniciando recarga Datos...*");
System.out.println("*************************************");
try{
Timer timer= new Timer();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.AM_PM, 0);
Date date = calendar.getTime();
timer.schedule(new ImportarDatos(), date, 24 * 60 * 60 * 1000);
}catch (Exception e) {
log.debug("Error no controlado");
}
System.out.println("");
Cada vez que arranque la aplicacion se ejecutara esta tarea y tambien a la hora que le hmos puesto, hay que saber que la hora es una menos si yo he puesto a las 2 de la madrugada se ejecutara a la 1.
La clase TimerTask tiene un metodo run que es como los Thread, lo que contiene el metodo run es lo que se va a ejecutar cada cierto periodo.
La clase Timer la utilizamos para para programar tareas para ejecutar en el futuro en un hilo de fondo. Las tareas se pueden programar para un tiempo de ejecución, o para la ejecución repetida a intervalos regulares.
En mi proyecto lo he colocado en la clase que arranca el proyecto, dentro de esa clase me he creado un clase interna:
class ImportarDatos extends TimerTask {
public void run() {
//// Damos baja prioridad al hilo
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
*********************tareas a realizar*****************************
}
Y dentro de la clase del listener me he creado lo siguiente:
System.out.println("*************************************");
System.out.println("* Iniciando recarga Datos...*");
System.out.println("*************************************");
try{
Timer timer= new Timer();
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, 2);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.AM_PM, 0);
Date date = calendar.getTime();
timer.schedule(new ImportarDatos(), date, 24 * 60 * 60 * 1000);
}catch (Exception e) {
log.debug("Error no controlado");
}
System.out.println("");
Cada vez que arranque la aplicacion se ejecutara esta tarea y tambien a la hora que le hmos puesto, hay que saber que la hora es una menos si yo he puesto a las 2 de la madrugada se ejecutara a la 1.
viernes, 6 de noviembre de 2009
Creando nueva base de datos
Estoy empezando a crear una base de datos desde cero para una aplicación de mi empresa.
Nosotros nos creamos unos ficheros para luego utilizarlos en la instalación.
Los ficheros que nos creamos son:
Voy a explicar como hago cada ficheros y que es cada cosa:
Fichero de las tablas
En este fichero vamos a tener la instrucción siguiente para crear las tablas que necesitemos:
CREATE TABLE NOMBRE_TABLA(
campo1 tipo de variable (number, varchar,.....) null or not null,
campo2 tipo de variable (number, varchar,.....) null or not null,
campo3 tipo de variable (number, varchar,.....) null or not null,
....... tipo de variable (number, varchar,.....) null or not null,
);
Fichero con las constraints
La cláusula constraints la utilizamos para crear o eliminar índices que pueden ser único o múltiples.
Puede ir seguido de:
ALTER TABLE NOMBRE_TABLA ADD (
CONSTRAINT PK_NOMBRE_TABLA PRIMARY KEY (campo));
Fichero de los índices
Yo me he creado un fichero de índices para las tablas que tiene muchos datos , así las búsquedas serán más rápidas,los índices se crean sobre el o los campos que vayamos mas a utilizar, la sentencia para crear índices es la siguiente:
CREATE UNIQUE INDEX NOMBRE_INDICE ON TABLA(campo);
Fichero de las secuencias
Para la generación de códigos numéricos automáticos utilizamos las secuencias
CREATE SEQUENCE
[MINVALUE ] -->valor mínimo de la secuencia
[MAXVALUE ]--> valor máximo de la secuencia
[START WITH ]--> por el numero que va a empezar la secuencia
[INCREMENT BY ] --> valor que va a incrementar cada vez que insertemos
[NOCACHE | CACHE ]--> se utiliza para que la generación de secuencia vaya mas rápido
[CYCLE] ;-->nocycle or cycle, si ponemos cycle cuando llega al MAXVALUE volvera a empezar desde el MINVALUE, esto puede que no cree exclusividad y si ponemos nocycle nos saldrá un error:
RDB%-E-SEQNONEXT, el siguiente valor para la secuencia "NOMBRE SECUENCIA" no está disponible.
Ficheros con los triggers
Los triggers son disparadores que se ejecuta cuando se cumple una condición establecida al realizar un INSERT, UPDATE o DELETE.
Si vamos a necesitar triggers nos creamos este archivo, la sintaxis de un trigger con update podría ser la siguiente:
CREATE TRIGGER nombre_trigger
BEFORE UPDATE ON nombre_tabla
REFERENCING NEW ROW AS campo,OLD ROW AS campo
FOR EACH ROW
condición THEN
END IF;
Fichero de views
Las vistas (views) son consultas, que refleja el contenido de una o más tablas, desde la que se puede acceder a los datos como si fuera una tabla. Así obtenemos seguridad en nuestras tablas sino queremos que el usuario acceda a otras datos de las tablas.O nos evitamos el escribir complejas sentencias sql.
Fichero de insert
En este fichero vamos a tener las sentencias sql de inserción de datos de las tablas.
Fichero de permisos (grant)
Concede permiso a un usuario sobre las tablas o vistas. Permiso de SELECT,INSERT, DELETE o UPDATE.
Ficheros de sinónimos
Este fichero contiene las sentencia de creación de sinónimos sobre las tablas o vistas, esto quiere decir que una tabla o vista puede tener dos nombre diferentes, el de la tabla y el de sinónimo que hace referencia a esa tabla. Los sinónimos nos proporciona la ventaja de independizar las tablas físicas de las aplicaciones y que un usuario acceda a otra tablas de otro usuario si tiene permisos para ello.
Nosotros nos creamos unos ficheros para luego utilizarlos en la instalación.
Los ficheros que nos creamos son:
- Crear fichero con las tablas.
- Crear fichero con las constraints de las tablas.
- Crear fichero con los índices necesarios.
- Crear fichero con las secuencias de las tablas.
- Crear fichero con los triggers.
- Crear fichero con los views.
- Crear fichero con los insert de las tablas.
- Crear fichero con los permisos a las tablas
- Crear ficheros de sinónimos.
Fichero de las tablas
En este fichero vamos a tener la instrucción siguiente para crear las tablas que necesitemos:
CREATE TABLE NOMBRE_TABLA(
campo1 tipo de variable (number, varchar,.....) null or not null,
campo2 tipo de variable (number, varchar,.....) null or not null,
campo3 tipo de variable (number, varchar,.....) null or not null,
....... tipo de variable (number, varchar,.....) null or not null,
);
Fichero con las constraints
La cláusula constraints la utilizamos para crear o eliminar índices que pueden ser único o múltiples.
Puede ir seguido de:
- UNIQUE --> para decir que el valor de ese campo es único
- PRIMARY KEY -->crea un índice primario el campo o los campos especificados. Todos los campos de la clave principal deben ser únicos y no nulos, cada tabla sólo puede contener una única clave principal.
- FOREIGN KEY -->crea un índice sobre el campo cuyo valor sera el contenido de otro campo de otra tabla o de la misma. Puede ser null y se pueden crear varias claves ajenas
ALTER TABLE NOMBRE_TABLA ADD (
CONSTRAINT PK_NOMBRE_TABLA PRIMARY KEY (campo));
Fichero de los índices
Yo me he creado un fichero de índices para las tablas que tiene muchos datos , así las búsquedas serán más rápidas,los índices se crean sobre el o los campos que vayamos mas a utilizar, la sentencia para crear índices es la siguiente:
CREATE UNIQUE INDEX NOMBRE_INDICE ON TABLA(campo);
Fichero de las secuencias
Para la generación de códigos numéricos automáticos utilizamos las secuencias
CREATE SEQUENCE
[MINVALUE ] -->valor mínimo de la secuencia
[MAXVALUE ]--> valor máximo de la secuencia
[START WITH ]--> por el numero que va a empezar la secuencia
[INCREMENT BY ] --> valor que va a incrementar cada vez que insertemos
[NOCACHE | CACHE ]--> se utiliza para que la generación de secuencia vaya mas rápido
[CYCLE] ;-->nocycle or cycle, si ponemos cycle cuando llega al MAXVALUE volvera a empezar desde el MINVALUE, esto puede que no cree exclusividad y si ponemos nocycle nos saldrá un error:
RDB%-E-SEQNONEXT, el siguiente valor para la secuencia "NOMBRE SECUENCIA" no está disponible.
Ficheros con los triggers
Los triggers son disparadores que se ejecuta cuando se cumple una condición establecida al realizar un INSERT, UPDATE o DELETE.
Si vamos a necesitar triggers nos creamos este archivo, la sintaxis de un trigger con update podría ser la siguiente:
CREATE TRIGGER nombre_trigger
BEFORE UPDATE ON nombre_tabla
REFERENCING NEW ROW AS campo,OLD ROW AS campo
FOR EACH ROW
condición THEN
END IF;
Fichero de views
Las vistas (views) son consultas, que refleja el contenido de una o más tablas, desde la que se puede acceder a los datos como si fuera una tabla. Así obtenemos seguridad en nuestras tablas sino queremos que el usuario acceda a otras datos de las tablas.O nos evitamos el escribir complejas sentencias sql.
Fichero de insert
En este fichero vamos a tener las sentencias sql de inserción de datos de las tablas.
Fichero de permisos (grant)
Concede permiso a un usuario sobre las tablas o vistas. Permiso de SELECT,INSERT, DELETE o UPDATE.
Ficheros de sinónimos
Este fichero contiene las sentencia de creación de sinónimos sobre las tablas o vistas, esto quiere decir que una tabla o vista puede tener dos nombre diferentes, el de la tabla y el de sinónimo que hace referencia a esa tabla. Los sinónimos nos proporciona la ventaja de independizar las tablas físicas de las aplicaciones y que un usuario acceda a otra tablas de otro usuario si tiene permisos para ello.
martes, 3 de noviembre de 2009
Barra de progreso con Rich Faces
Estoy importando unos datos y para que el usuario no se crea que no esta haciendo nada la aplicacion he creado una barra de progreso para que veo como va la importación de datos.
Para ello he utilizado las etiquetas siguiente:
y el metodo en mi clase que hace la importacion es :
public String actionImportarDatos(){
progreso = 1;
enProgreso = true; //sino esta a true no sale la barrita
List listadoDatosImportar = new LinkedList();
listadoDatosImportar =método para rellenar esta lista con los datos que voy a importar;
total = listadoDatosImportar.size();
for (DatosIMportar datos : listadoDatosImportar) {
progreso++;
BO. save(datos); //en el BO tengo un metodo que guarda ese dato importado en la tabla.
}
mensaje = "Libros importados correctamente";
return null;
}
public int getPorcentaje() {
try {
return Math.min(progreso * 100 / total, 100);
} catch (ArithmeticException e) {
return 0;
}
}
Para ello he utilizado las etiquetas siguiente:
y el metodo en mi clase que hace la importacion es :
public String actionImportarDatos(){
progreso = 1;
enProgreso = true; //sino esta a true no sale la barrita
List
listadoDatosImportar =método para rellenar esta lista con los datos que voy a importar;
total = listadoDatosImportar.size();
for (DatosIMportar datos : listadoDatosImportar) {
progreso++;
BO. save(datos); //en el BO tengo un metodo que guarda ese dato importado en la tabla.
}
mensaje = "Libros importados correctamente";
return null;
}
public int getPorcentaje() {
try {
return Math.min(progreso * 100 / total, 100);
} catch (ArithmeticException e) {
return 0;
}
}
Suscribirse a:
Entradas (Atom)