webForumDet fria alternativet

Använda XML som databas

.NETur .NET

2 svar · 610 visningar · startad av Pedda

Medlem sedan juni 20006 031 inlägg
Frågan#1

Ska snart sätta igång att skriva en applikation som kommer använda en XML fil som databas.
Applikationen kommer användas av flera personer samtidigt, hur många vet jag inte ännu men ca 30 st.
Vad bör man tänka på som kan ställa till det när flera läser/skriver till samma fil?
Även om jag läser in filen till ett dataset så vet man ju inte hur mycket som har ändrats av andra innan den sparas ner igen.

Blir förmodligen en webbapplikation ASP.NET eller en desktop applikation.
Webbapplikation har ju en del fördelar som att ingen lokal installation krävs, uppdateringar sker på en server, alla kör samma version mm.

Medlem sedan maj 20012 812 inlägg
#2

pedda skrev:

Webbapplikation har ju en del fördelar som att ingen lokal installation krävs, uppdateringar sker på en server, alla kör samma version mm.

Kan du leva med SmartClients så får du nästan samma fördelar som din webbapplikation bara det att du får styrkan hos en desktop applikation med. Det hela är att man ge användaren en URL till programmet, och när användaren trycker på URL:en så laddas programmet ner och installeras. När användare sedan startar sitt program så går den upp mot servern och den URL som är definerad för att kontrollera om det finns en ny version innan applikationen startas.

Den nackdelen som finns här är så fall att man inte kan skicka med XML-Filen eftersom du säkert vill att alla skall dela på samma data, så den måste ligga kvar på servern och du måste kommunicera mot denna på något sätt. Jag skulle föreslå en services av något slag, helst WCF, för att sköta kommunikationen mot XML-filen. Då kan du relativt enkelt byta ut din datakälla mot en riktigt databas senare, utan att behöva skriva om något i dina klienter...

- M

Medlem sedan juni 20008 205 inlägg
#3

Pedda skrev:

Vad bör man tänka på som kan ställa till det när flera läser/skriver till samma fil?
Även om jag läser in filen till ett dataset så vet man ju inte hur mycket som har ändrats av andra innan den sparas ner igen.

Det finns en anledning till att DBMS:er är såna monster som de är, det här är som du kanske kan ana jävligt komplicerat om man vill ha någon prestanda alls. Undvik om det på något sätt är möjligt.

Om du inte kan undvika är nog det enklaste alternativet för dig att du kör med optimistisk låsning, dvs du läser in filen, gör förändringarna, och sen innan du skriver kollar du om innehållet ändrats sen du läste in nåt. Har det ändrats kan det antingen vara oproblematiskt (om det bara ändrades saker som du inte ändrade på) eller så har du en konflikt, i vilket fall du får försöka göra om ändringarna med den nya datan, eller säga att det inte gick att genomföra ändringen. Det funkar rätt bra om det mest är läsningar som händer, lite sämre om det är mycket skrivningar.

Ett enkelt (och ineffektivt) exempel är att använda filens ändringsdatum. En "skrivtransaktion" skulle då se ut så här i pseudokod:

DateTime readMod;
using (skaffa-läslås-till-filen()) {
    läs-in-innehållet();
    readMod = filens-ändringsdatum();
}
int retry = 5; // antalet gånger att försöka göra om förändringarna
while (retry-- > 0){
    gör-förändringarna();
    using (skaffa-skrivlås-till-filen()) {
        if (filens-ändringsdatum() == readMod) {
            skriv-ändringarna();
            retry = 0;
        }
    }
}

I gör-förändringarna() får du förstås på något vis kolla att användaren har begärt rimliga åtgärder, verkar det knasa där får du avbryta och lämna ett felmeddelande ("försök igen"). En bra idé kan vara att ha timestamps på alla objekt i XML-filen som visar när de senast ändrades.

Men som sagt, det här är egentligen ingen bra lösning. XML-filer är inte lämpliga som datakällor för applikationer med flera samtidiga användare.

134 ms totalt · 3 externa anrop · v20260731065814-full.4bcf49fe
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)