Foros del Web » Programación para mayores de 30 ;) » Java »

Duda simple sobre variable que no se resetea en app web

Estas en el tema de Duda simple sobre variable que no se resetea en app web en el foro de Java en Foros del Web. Buenas estoy realizando una aplicacion web y el tema es que creo una agenda en la que gestiono unos eventos, cada uno de los cuales ...
  #1 (permalink)  
Antiguo 08/07/2013, 15:10
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años
Puntos: 0
Duda simple sobre variable que no se resetea en app web

Buenas estoy realizando una aplicacion web y el tema es que creo una agenda en la que gestiono unos eventos, cada uno de los cuales tiene un id unico y no repetible, la pregunta es sencilla:

- Existe alguna forma de crear una variable que no reinicie su valor entre paradas y runs del servidor?

La forma que se me ha ocurrido es guardar la variable en una base de datos sql y asi leerla, ver cuanto vale, asignar el valor al id del evento que toque, incrementarla y sobreescribir la base de datos, estaria bien asi? o existe una solucion mejor? gracias
  #2 (permalink)  
Antiguo 09/07/2013, 08:30
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda simple sobre variable que no se resetea en app web

Hola:

Lo habitual es dejar que ese id lo cree la base de datos, bien con auto increment (MySQL) o bien con secuencias (Oracle, PostgreSQL).

Si no quieres dejar esa responsabilidad a la base de datos, la siguiente opción es la que comentas, consultar e incrementar en 1. No es necesario guardar ese id en base de datos, basta con hacer una consulta select max(id) from tabla;.
Pero tienes que asegurarte bien que sólo se hace la consulta una vez en el arranque, se guarda ese valor en una variable de programa accesible para todo el código que lo necesite y a partir de ahí se incrementa directamente la variable cuando haga falta. Si cada trozo de código de programa hace la consulta de ese id a la base de datos y hay varios hilos trabajando, puedes tener conflictos, ya que un segundo hilo podría leer el mismo valor que el primero si al primero no le ha dado tiempo a hacer el insert.

Finamente, otra opción es elegir como id algo aleatorio y que tengas cierta garantía que nunca se repite. Se suele usar UUID.randomUUID() que genera cosas como 550e8400-e29b-41d4-a716-446655440000 con un algoritmo que garantiza que es muy improbable que haya repeticiones, incluso aunque ejecutes en servidores distintos de la misma red. Está pensado para obtener ids únicos en entonos distribuidos y por eso quizás se matar "moscas a cañonazos" si solo tienes una aplicación en un solo servidor y una sola base de datos.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #3 (permalink)  
Antiguo 10/07/2013, 05:25
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años
Puntos: 0
Respuesta: Duda simple sobre variable que no se resetea en app web

Me inclino mas por la solución de leer el id de la base de datos puesto que el id tiene que ser un numero limitado entre cierto rango de valores

Podrias indicarme algun tutorial o decirme un poco como puedo hacer que una variable sea accesible y comun para todo el codigo y todos los hilos? estoy acostumbrado a struts2 y una vez se ejecuta un action todas sus variables se destruyen por lo que no tengo ni idea de como hacerlo, gracias
  #4 (permalink)  
Antiguo 10/07/2013, 05:50
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda simple sobre variable que no se resetea en app web

Si es todo dentro de la misma aplicación, basta con crear una variable estática en cualquier clase. Lo ideal sería hacer una clase como esto.

Código java:
Ver original
  1. public class GeneradorIds{
  2.    private static int id=0;
  3.    public static synchronized void idInicial (int idInicial) {
  4.        id=idInicial;
  5.    }
  6.    public static synchronized int siguienteId() {
  7.          return id++;
  8.    }
  9. }

En el arranque, lee la base de datos y llama a GeneradorId.idInicial(valor leido de bd)

Cuando necesites un id nuevo en cualquier sitio, simplemente GeneradorId.siguienteId();

Al ser todo static, no es necesario hacer new de la clase. Lo del synchronized, para algo tan tonto como return id++ o id=idInicial no estoy seguro que haga falta, pero por si acaso.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #5 (permalink)  
Antiguo 10/07/2013, 05:58
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años
Puntos: 0
Respuesta: Duda simple sobre variable que no se resetea en app web

Vale muchisimas gracias! esta misma tarde lo pruebo :)

Y un buen momento para leer el valor en la base de datos seria por ejemplo en el action correspondiente a mi accion de login (dado que es la primera action de mi aplicacion) pero y para escribir la variable en la base de datos?
  #6 (permalink)  
Antiguo 10/07/2013, 06:29
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 19 años, 6 meses
Puntos: 454
Respuesta: Duda simple sobre variable que no se resetea en app web

Depende, si hay varios usuarios y cada uno hace un login, no vale.

Lo suyo es poner un ServletContextListener http://www.mkyong.com/servlet/what-i...tener-example/ de forma que cuando se despliega tu aplicación, se haría la consulta.

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #7 (permalink)  
Antiguo 11/07/2013, 14:55
 
Fecha de Ingreso: abril-2013
Mensajes: 36
Antigüedad: 11 años
Puntos: 0
Respuesta: Duda simple sobre variable que no se resetea en app web

Vale lo probare, mil gracias por la ayuda!! :)

Etiquetas: app, simple, variable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:14.