28. oktober 2004 - 14:42
Der er
2 kommentarer og
1 løsning
cache problem eller lign.
Jeg har de sidste par dage oplevet et sært problem.
Jeg får "forældet" data data ud af databasen. Når jeg henter data på én PC gennem min Java applikation , får jeg data som databasen var før ændringer. Åbner jeg en ny PC får jeg de nyeste og aktuelle data, samtidig med PCén ved siden af stadig viser de gamle data
Jeg ved ikke om det kan skyldes at jeg henter data ind i java objekter og de caches af enten server eller lign. Men problemet løser sig IKKE ved at lukke browseren ned og starte forfra.
Serveren ligger på et webhotel og er en Resin med MySQL DB.
Det er ligesom det ikke er sket før nu, men jeg har oplevet i flere tilfælde inden for den seneste uge, i uafhængeige og forkskellige dele af koden.
kan DB data være cahcet, eller er det på objekter på serveren?
Nogen der har oplevet noget lign. eller evt. har en forklaring?
29. oktober 2004 - 10:23
#2
Det sker fler steder.
Men f.eks.
Jeg har en klasse DBUtils der "holder styr på" databaseadgangen. Den indeholder en række metoder der står for at åbne og lukke connection , udtrække resultsets og pakke dem i relevante datastrukturer. f.eks arrayLists og HashMaps.
Et eksempel.
jeg har en servlet der genererer et excel ark på med hkjælp fra apache.POI pakken. servletten kører og henter data ind gennem DBUtils i arrayList indholdende HashMaps.
f.eks.
ArrayList list = DBUtils.selectFromWhere("*","users","user_id>1");
herefter generes diverse POI objekter og excel filen skrives til serveren.
hvis jeg så kører nedenstående servlet, skrives excelarket fint.
Herefter opdater jeg gennem et andet interface databsen. og jeg kan se i DB at ændringerne har fundet sted.
Hvis jeg så sletter excel filen på serveren og kører servletten igen, generes excelfilen med data fra før opdateringer. Eftersom jeg kan se at DB er ændret, undrer det mig hvor den får de gamle data fra. De må være chachet et eller andet sted.
kører jeg servletten fra en anden PC dog, genreres excel filen på bagrund af de nye data. Så cahcen må være relateret ti den enkelte brugersession. Men jeg har prøvet at lukke browser ned, slette cahce osv. og det gør ingen forskel. Først vist man vender tilbage f.eks dagen efter får man de nye data i excel filen.
Jeg har andre steder i min kode oplevet det samme hvor det virker som om at DB kaldene får forældet data ud.
koden til servletten ses nedenfor:
package dk.skow.admintool;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
public class UserExport extends HttpServlet {
public void init(ServletConfig config)throws ServletException {
super.init(config);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
// If it is a get request forward to doPost()
doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
//for notes
PrintWriter out = response.getWriter();
String outputFile=Ini.getSystemUrl()+"admintool/excel/users.xls";
try{
// Create a New XL Document
HSSFWorkbook wb = new HSSFWorkbook();
// Make a worksheet in the XL document created
HSSFSheet sheet = wb.createSheet();
//lav den første linie
HSSFRow topRow = sheet.createRow((short)0);
//lav celler med topværdier
HSSFCell TOP_user_id = topRow.createCell((short)0);
TOP_user_id.setCellValue("ID");
HSSFCell TOP_fnavn_id = topRow.createCell((short)1);
TOP_fnavn_id.setCellValue("FIRS TNAME");
HSSFCell TOP_enavn_id = topRow.createCell((short)2);
TOP_enavn_id.setCellValue("LAST NAME");
HSSFCell TOP_email_id = topRow.createCell((short)3);
TOP_email_id.setCellValue("E-MAIL");
HSSFCell TOP_brugernavn_id = topRow.createCell((short)4);
TOP_brugernavn_id.setCellValue("USERNAME");
HSSFCell TOP_organisation_id = topRow.createCell((short)5);
TOP_organisation_id.setCellValue("ORGANISATION");
HSSFCell TOP_jobtitle_id = topRow.createCell((short)6);
TOP_jobtitle_id.setCellValue("JOB TITLE");
HSSFCell TOP_address_id = topRow.createCell((short)7);
TOP_address_id.setCellValue("ADDRESS");
HSSFCell TOP_postal_id = topRow.createCell((short)8);
TOP_postal_id.setCellValue("POSTAL_CODE");
HSSFCell TOP_city_id = topRow.createCell((short)9);
TOP_city_id.setCellValue("CITY");
HSSFCell TOP_country_id = topRow.createCell((short)10);
TOP_country_id.setCellValue("COUNTRY");
HSSFCell TOP_membership_country_id = topRow.createCell((short)11);
TOP_membership_country_id.setCellValue("EIRM MEMBERSHIP");
HSSFCell TOP_expires_id = topRow.createCell((short)12);
TOP_expires_id.setCellValue("EXPIRES");
//now get the group names
ArrayList groups = DBUtils.selectFromWhere("*","phpbb_groups","1");
for (int x = 0; x < groups.size() ; x++ ) {
HSSFCell TOP_groups = topRow.createCell((short)(13+x));
HashMap hm = (HashMap)groups.get(x);
String name = (String)hm.get("group_name");
TOP_groups.setCellValue(name);
}
//hent grunddata fra user_profile
ArrayList users = DBUtils.selectFromWhere("*","user_profile","user_id > 0 ORDER BY user_id");
HSSFCell cell = null;
for (int x = 0; x < users.size() ; x++ ) {
//grunddata
HashMap hm = (HashMap)users.get(x);
HSSFRow row = sheet.createRow((short)(x+1));
cell = row.createCell((short) 0);
String ID = (String)hm.get("user_id");
cell.setCellValue(ID);
cell = row.createCell((short) 1);
String fnavn = (String)hm.get("fnavn");
cell.setCellValue(fnavn);
cell = row.createCell((short) 2);
String enavn = (String)hm.get("enavn");
cell.setCellValue(enavn);
cell = row.createCell((short) 3);
String email = (String)hm.get("email");
cell.setCellValue(email);
cell = row.createCell((short) 4);
String brugernavn = (String)hm.get("brugernavn");
cell.setCellValue(brugernavn);
//extensiondata
ArrayList extraData = DBUtils.selectFromWhere("*","extranetextension","user_profile_id="+ID);
HashMap hme = (HashMap)extraData.get(0);
cell = row.createCell((short) 5);
String virksomhed = (String)hme.get("virksomhed");
cell.setCellValue(virksomhed);
cell = row.createCell((short) 6);
cell.setCellValue((String)hme.get("afdeling"));
cell = row.createCell((short) 7);
cell.setCellValue((String)hme.get("adresse"));
cell = row.createCell((short) 8);
cell.setCellValue((String)hme.get("postnummer"));
cell = row.createCell((short) 9);
cell.setCellValue((String)hme.get("lokation"));
cell = row.createCell((short) 10);
cell.setCellValue((String)hme.get("land"));
cell = row.createCell((short) 11);
cell.setCellValue((String)hme.get("mdlland"));
cell = row.createCell((short) 12);
cell.setCellValue((String)hme.get("dato"));
//groupdata
for(int y = 0 ; y<groups.size() ;y++ ) {
String user_id = ""+ID;
HashMap hmg = (HashMap)groups.get(y);
String group_id= (String)hmg.get("group_id");
boolean member = DBUtils.relationExistsGroupUser(group_id , user_id);
cell = row.createCell((short)(13+y));
cell.setCellValue(member);
}
}
// The Output file is where the xls will be created
FileOutputStream fOut = new FileOutputStream(outputFile);
// Write the XL sheet
wb.write(fOut);
fOut.flush();
// Done Deal..
fOut.close();
//System.out.println("File Created ..");
}catch(Exception e) {
System.out.println("!!BANG!! xlCreate() : " + e );
}
out.println(" <head><TITLE>Excel export</TITLE><LINK REL='stylesheet' type='text/css' href='/css/oakstyle.css'></head>");
out.println("<body><a href='"+Ini.getHomeUrl()+"admintool/excel/users.xls'>click here to download excel-spreadsheet</a><body>");
}
}