10. maj 2008 - 12:06Der er
8 kommentarer og 1 løsning
Reader/writer synchronization
Jeg er ved at lave et Java program, som skal samle omsætningstal fra fem forskellige kasseapparater/computere og vise en omsætningsoversigt i en tabel.
Kasseapparatet er indrettet således, at det hver gang der sælges en vare, åbnes en simpel tekstfil og der tilføjes en salgslinje i slutningen af filen. Det er denne fil som mit program læser.
Selvom disse filer aldrig bliver større end 100 kb, tager det alligevel ca. 1 sekund at læse filen, da det foregår over netværk.
Kan der opstå problemer, hvis vi nu forestiller os at mit program er ved at læse en af disse filer, og mens den gør det, forsøger kasseprogrammet at åbne filen og tilføje en ny salgslinje?
Det er jo i denne sammenhæng super vigtigt at der ikke går nogle salgsdata tabt.
Hos Computerworld it-jobbank er vi stolte af at fortsætte det gode partnerskab med folkene bag IT-DAY – efter vores mening Danmarks bedste karrieremesse for unge og erfarne it-kandidater.
En database ville være langt bedre til at håndtere samtidigheds problemerne.
Hvis du hænger på filer, så skal du sikre dig at dit program ikke låser filen for kasseapperaterne. Måske var det bedre hvis dit program arbejdede på en kopi ??
Ja, en database vil helt klart være at foretrække, men sagen er den at det ikke er mig, der har udviklet kasseprogrammet, så det kan der desværre ikke laves om på.
Det med en kopi har jeg overvejet, men så er jeg vel stadig nød til åbne filen for at kunne kopiere den? Eller har du nogen idéer?
Jo. Men hvis den kopi kunne laves lokalt (ikke over netværk), så burde det kunne gå meget hurtigere.
En anden mulighed var at bruge et eller andet til at synkronisere adgangen til filen, men jeg fornemmer lidt at det heller ikke er en mulighed p.g.a. der ikke kan ændres på den anden app.
Har du testet om den version af Java du bruger + det netværks software du bruger til at læse filerne rent faktisk låser filen, så der ikke kan skrives tild en ?
Butikkerne som kasseapparaterne står i, er en del af kæde, hvor kasseprogrammet er udviklet på hovedkontoret, så nej, jeg kan ikke ændre på kasseprogrammet.
Jeg har testet med følgende kodestump. Når programmet "går i stå" ved beskedboksen, kan jeg uden problemer åbne tekstfilen i notepad og tilføje et par linjer og gemme igen. Jeg bruger Java 5 på Windows XP. Kasseapparaterne kører Windows XP og 2000.
try { BufferedReader br = new BufferedReader(new FileReader("trans.txt"));
for (int i = 0 ; i < 20 ; i++) // Læs lidt af filen br.readLine();
En mulighed var måske at lade dit program lytte til hvornår filen senest er ændret vha. lastModified() (måske hvert sekund) og så læse hurtigst muligt efter filen er ændret, der er sikkert mere end et sekund mellem hver gang kasseapparatet skriver til filen.
lastModified kaster en SecurityException hvis filen er låst, men kan jo håndteres
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.