Håller på med en "ocassionally connected application" (som Microsoft kallar det) i .Net, dvs den ska gå att köra utan att vara ansluten till en databas. Det där är inte helt trivialt, är det så att du kan tänka dig att viss information inte är tillgänglig när du inte är "online". Det kommer definitivt att bli skillnader online & offline, vissa anläggningar har tex. kundregister med 100 000+ poster (inkl foton), och det är ju inte aktuellt att synka ut. Jag skulle se efter om det fungerar med SQL Server Compact Editdion på klienten och synka mot SQL Server Express på servern mha MS Sync Framework. Som sagt, både SQL CE och Sync Framework skapar mer problem än dom löser i mitt fall känner jag. jag har lost det pa ett lite annorlunda satt som du kanske kan fa ideer ifran. Intressant läsning, tack för att du tog dej tid.Alternativ till lokal databas
Är 99% inställd på att använda NHibernate för datalager, och var ganska nära att få till en lösning med Bamboo.Prevalence som cache. Men det stöp på att NHibernate inte kollar level-2 cache när man dödat sin sessionfactory/startat om applikationen.
Finns det något sätt att "lura" NHibernate att enbart fråga mot cache, om man inte har databasanslutning?
Alternativ 2 är en lokal databas, men jag skulle gärna slippa allt bök kring synkning, databasnycklar osv (har en befintlig db med identity-fält som primärnycklar). ADO.Net Sync Framework känns inte helt smidig, måste hålla på och generera datasets helt i onödan tex.
Tacksam för ideér, och har någon ett bra förslag/färdig lösning finns det utrymme att få betalt för några dagars jobb.Sv: Alternativ till lokal databas
Själv har jag i den sitsen att jag har en applikation som kan gå "offline" men som ändå måste fungera, men jag har lyxen att viss information inte behöver vara tillgänglig då vilket ju underlättar massor. Vilket gör att jag behåller en del information i min lokala cache (vilket ju dessutom ökar prestandan rejält eftersom man slipper göra anrop över internet då.
Om inte så tror jag att alternativet blir en lokal databas eftersom det kommer bli en hel del data som du måste hålla i koll på och det är inte helt trivialt och speciellt prestanda smart. Men om du använder dig av repilkering i SQL Server så bör den hantera allt bök med synkroniseringen och nyckel problem. Om du får problem med nycklarna så är mitt tips att du använder dig av GUID som nyckel istället för Identity fält, om det går.
- MSv:Alternativ till lokal databas
Tvåvägsreplikering med MS SQL är nog inte genomförbart, med tanke på licenskostnad och administration. (det kan vara något hundratal klienter, och lokala servrar finns inget sätt att lösa administrativt).
Kan inte ändra speciellt mycket i db heller, då en stor del av systemet ligger kvar i VB6, och det måste fortsätta funka ett tag framöver. När allt väl är över i .NET (och det finns bra tester) så är det ett annat läge, men just nu får jag leva med identityfält o dyl.
Lutar lite åt att skippa NHibernate's nivå-2 cache, och hantera den själv för läsning offline. Objekt som ska skrivas skulle man kunna serialisera ner på disk när man är offline, eller kanske använda Bamboo el. dyl. Finns det någon liknande objekt-db som är mer aktivt underhållen förresten? (orsaken till att jag inte vill använda SQL CE eller något sådant är att det blir svårt att använda samma schema som den centrala servern för identityfällt mm, och jag vill inte underhålla flera mappningar för varje objekt)Sv: Alternativ till lokal databas
/johan/Sv:Alternativ till lokal databas
Har gjort en proof-of-concept-lösning, där varje repository håller en cache som serialiseras till och från disk. Övriga applikationen får bara tillgång till IEnumerable<> (eller IQuerable<> för de entiteter som bara ska hanteras online), och en enkel Get. Repository håller själv koll på när cache ska refreshas osv.
Funkar rätt bra, men det optimala vore såklart en mer robust och beprövad lösning. Har kikat lite på db4o, men runtime-licenser slipper man ju gärna, blir så mycket administration kring det för säljorganisationen.Sv: Alternativ till lokal databas
For det forsta sa maste min klient veta nar den gar "offline" sa den kan informera anvandare om att den nu ar i ett offline lagge och stanga visa funktioner och dessutom varna anvandern att datan som visas inte ar helt tillforlitlig. Det gors med en heartbeat till servern.
Det andra ar att jag har en cache lite hogre upp allts i en applikationsservices som kontrollera om klienten ar offline/online, om den ar offline sa visas varningsmeddelandet och data fran cachen visas. Om klienten ar online sa kontrolleras om data finns i cachen sa fall visa den, annars sa hamta fran servern. Problemet som jag stotte pa har var att om nagra forandringar gors pa servern sa kan jag inte fa dessa eftersom jag endast gar till servern om jag inte redan har data i cahcen. Sa jag anvander heartbeaten till att hamta alla data som har andrats sedan sista heartbeaten och sedan lagga ner den i cachen, det betyder att min data endast ar inkorrekt sa lange som jag staller heartbeaten till (typ 15 sekunder).
Det andra problemet jag stotte pa vara nar jag har refererade objekt i ett objekt. Sag att jag har ett valutaobjekt till mitt artikel. Nar jag laddar artiklen sa hamtar jag aven valutaobjektet som sager att priset ar i USD och den nu ar 8.15 SEK. Om nu nagon annan klient nu andrar detta valuta objekt till 8.00 SEK hur skall min artikel fa reda pa detta? Sa jag satte upp kriterier om detta var kritisk information som maste ut till alla klienter sa fort som mojligt och sa la jag till att dessa objekt skall finnas i cachen och skickas ut med heartbeaten... gott sa langt sa bra. Testade med lite valuta objekt och sag att det forandrades i de olika klienterna nar jag andrade i en, testade sedan att hamta min artikel med valuta objekt 8.15 SEK, gick till en annan klient och andrade valuta objektet till 8.00 SEK. Titta pa min artikel och ser att den fortfarande ar 8.15 SEK, tittar pa objektet i cachen och den ar 8.00 SEK!!!! Problemet blir ju att jag hamtade valuta objektet tillsammans med mitt artikelobjekt och nar den sedan ar ute pa klienten sa ligger den ju dar som ett objekt, sa det jag fick gora var att skicka med valutaobjektets ID med artiklen och i artiklen sa varje gang som jag vill ha mitt valuta objekt sa maste jag ga till cachen och leta upp valutaobjektet med mitt ID da fungerar det underbart, speciellt med binding i WPF. Man visar artikelinformationen och sa andrar man valuta objektet i en annan klient och man ser hur priset bara andras pa skarmen, ingen refresh eller nagot sadant... riktigt snyggt.
Funderade forst pa att ha nagon tidsstyrd refresh pa min cache som du har, men skippade det ratt snabbt av prestanda skal, det finns inget som helst skall till att hamta alla mina 1000-tals artiklar till mina klienter bara for att det kan ha hant nagot i nagra fatal. Nej det blev battre med heartbeaten och dessutom sa satta jag upp om klientens senaste heartbeat var aldre an 14 dagar sa tomms hela cachen och all data maste hamtas igen vid forfragning...
- MSv:Alternativ till lokal databas
Jag kommer nog att lösa det på en lite högre nivå än jag tänkt från början, just pga av objekt-referenser i cachade objekt, antagligen på application/services.
Det som är synd är att inga objektdatabaser verkar gå att fråga med LINQ på ett vettigt sätt, hade blivit mycket mer transparent lösning på så vis.