Filas repetidas en base de datos
Publicado por Hadock (13 intervenciones) el 14/04/2008 14:00:48
Buenos dias,
Tengo un problema en mi aplicacion. He creado un hilo que cada x tiempo se despierta y almacena la informacion de unos archivos en una base de datos.
Lo hace correctamente, pero por ejemplo si ejecuto la aplicacion, la primera vez guarda todas las entradas leidas en el archivo, y en la segunda ademas de las nuevas vuelve a almacenarla informacion que habia sido guardada antes, por lo que tengo mucha informacion duplicada. (La tercera vez que guarde volvera a repetirlo y asi sucesivamente).
He pensado en ir guardando en un String la informacion que ha sido almacenada en la base de datos, y las siguientes veces que vaya a actualizarla, compare la informacion de los archivos con el string y si estos han sido anteriormente almacenados no vuelva a repetir esta accion, pero si alguien sabe de una solucion mas optima se lo agradeceria muchisimo.
Aqui os dejo parte del programa que ejecuta el hilo:
import java.util.*;
public class DBThread extends Thread
{
Calendar c;
Date d;
public DBThread()
{
}
public void run()
{
c=new GregorianCalendar();
int year=c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
DBConector dbc=new DBConector();
while(true)
{
System.out.println("while");
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
// if(minute==0)
//{
String y,m,d;
if((year%100)<10)
y="0"+year;
else
y=""+year;
if(month<10)
m="0"+month;
else
m=""+month;
if(day<10)
d="0"+day;
else
d=""+day;
String LogName="ex"+y+m+d+".log";
//LogName="ex051108.log";
dbc.setData(LogName);
//}
try
{
sleep(60000);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
}
y la funcion setData:
public void setData(String LogName)
{
RemoteObject ro;
int i=0;
Conection c;
String[] data;
try
{
ro=new RemoteObject();
data=ro.FindLog(LogName);
while(data[i]!=null)
{
if(data[i].substring(0,1).compareTo("#")!=0)
{
c=divideString(data[i]);
DBConector dbc=new DBConector();
String datetime=c.getDate().getYear()+"/"+c.getDate().getMonth()+"/"+c.getDate().getDay();
datetime+=""+c.getDate().getHour()+":"+c.getDate().getMinutes()+":"+c.getDate().getSeconds();
String sql="INSERT INTO log_stats values (?,?,?,?,?,?,?,?,?,?)";
PreparedStatement ps=dbc.c.prepareStatement(sql);
ps.setString(1,null);
ps.setString(2,datetime);
ps.setString(3,c.getServer());
ps.setString(4,c.getMethod());
ps.setInt(5,c.getUser().getPort());
ps.setString(6,c.getUser().getIP());
ps.setString(7,c.getNavigator());
ps.setInt(8,c.getSc_status());
ps.setInt(9,c.getSc_substatus());
ps.setInt(10,c.getSc_win_substatus());
ps.executeUpdate();
}
i++;
}
}
catch(Exception e)
{
System.out.println(e);
}
}
Gracias a los que os tomais la molestia de leerlo
Tengo un problema en mi aplicacion. He creado un hilo que cada x tiempo se despierta y almacena la informacion de unos archivos en una base de datos.
Lo hace correctamente, pero por ejemplo si ejecuto la aplicacion, la primera vez guarda todas las entradas leidas en el archivo, y en la segunda ademas de las nuevas vuelve a almacenarla informacion que habia sido guardada antes, por lo que tengo mucha informacion duplicada. (La tercera vez que guarde volvera a repetirlo y asi sucesivamente).
He pensado en ir guardando en un String la informacion que ha sido almacenada en la base de datos, y las siguientes veces que vaya a actualizarla, compare la informacion de los archivos con el string y si estos han sido anteriormente almacenados no vuelva a repetir esta accion, pero si alguien sabe de una solucion mas optima se lo agradeceria muchisimo.
Aqui os dejo parte del programa que ejecuta el hilo:
import java.util.*;
public class DBThread extends Thread
{
Calendar c;
Date d;
public DBThread()
{
}
public void run()
{
c=new GregorianCalendar();
int year=c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int day = c.get(Calendar.DAY_OF_MONTH);
DBConector dbc=new DBConector();
while(true)
{
System.out.println("while");
int hour = c.get(Calendar.HOUR_OF_DAY);
int minute = c.get(Calendar.MINUTE);
// if(minute==0)
//{
String y,m,d;
if((year%100)<10)
y="0"+year;
else
y=""+year;
if(month<10)
m="0"+month;
else
m=""+month;
if(day<10)
d="0"+day;
else
d=""+day;
String LogName="ex"+y+m+d+".log";
//LogName="ex051108.log";
dbc.setData(LogName);
//}
try
{
sleep(60000);
}
catch(Exception e)
{
System.out.println(e);
}
}
}
}
y la funcion setData:
public void setData(String LogName)
{
RemoteObject ro;
int i=0;
Conection c;
String[] data;
try
{
ro=new RemoteObject();
data=ro.FindLog(LogName);
while(data[i]!=null)
{
if(data[i].substring(0,1).compareTo("#")!=0)
{
c=divideString(data[i]);
DBConector dbc=new DBConector();
String datetime=c.getDate().getYear()+"/"+c.getDate().getMonth()+"/"+c.getDate().getDay();
datetime+=""+c.getDate().getHour()+":"+c.getDate().getMinutes()+":"+c.getDate().getSeconds();
String sql="INSERT INTO log_stats values (?,?,?,?,?,?,?,?,?,?)";
PreparedStatement ps=dbc.c.prepareStatement(sql);
ps.setString(1,null);
ps.setString(2,datetime);
ps.setString(3,c.getServer());
ps.setString(4,c.getMethod());
ps.setInt(5,c.getUser().getPort());
ps.setString(6,c.getUser().getIP());
ps.setString(7,c.getNavigator());
ps.setInt(8,c.getSc_status());
ps.setInt(9,c.getSc_substatus());
ps.setInt(10,c.getSc_win_substatus());
ps.executeUpdate();
}
i++;
}
}
catch(Exception e)
{
System.out.println(e);
}
}
Gracias a los que os tomais la molestia de leerlo
Valora esta pregunta


0