Avatar billede dmk Nybegynder
15. juli 2004 - 11:22 Der er 6 kommentarer

Connection ID?

Hejsa

Er der nogen der ved om man kan aflæse et eller andet connection id i transact-sql for den aktive klient?

Scenariet er noget i stil med, at jeg skal gemme nogle word dokumenter i min database. Når en bruger henter et word dokument ud for at editere i det, skal det registreres at det pågældende dokument låses. Når man er færdig med at editere dokumentet, opdateres det i databasen, og låsen fjernes.

Problemet er, at hvis klient programmet går ned, får man aldrig låst op igen. Derfor var min ide, at man kunne gemme et connectionid når man gemmer låsen, og når man skal checke om noget er låst, checker man om den registreret connection stadig er aktiv.

Der er et process-id, som desværre ikke kan bruges. Dette ID bliver nemlig genbrugt (pga. connectionpooling), så hvis en app crasher og bliver startet igen, får den med høj sandsynlighed samme ID.

Nogle ideer?

/DMK
Avatar billede arne_v Ekspert
15. juli 2004 - 11:29 #1
Med connection pooling så tror jeg ikke at du kan gøre noget på TSQL niveau.

Du bliver nødt til at lave en lille tabel med:
  brugernavn
  dokumentnavn
  checkudtid
  leasetid
  checintid

Og så lade checkud indsætte en række i den tabel efter at have checket om
der er nogle stadig valide leases på dokumentet (valid => chekcintid er NULL og
nu < checkudtid + leasetid).
Avatar billede dmk Nybegynder
15. juli 2004 - 12:42 #2
Ja, timeout er naturligvis en mulighed.

Problemet er blot, at den ikke er ret sikker. Sæt nu bruger1 tager længere tid end leasetid på at skrive i dokumentet, og bruger2 i mellemtiden (efter timeout) ændrer noget i dokumentet og gemmer dette. Så vil bruger1 enten overskrive bruger2's ændringer, eller få af vide at han ikke kan gemme pga. timeout.

Timeout giver jo så også et andet problem: Hvis en bruger henter et dokument ud for at skrive i det, og BANG så går hans app ned, så vil han ikke kunne hente dokumentet ud igen før hans første checkout gav en timeout.


Jeg er muligvis på vej ind i en blindgyde her, men der MÅ da være en løsning...

/DMK
Avatar billede arne_v Ekspert
15. juli 2004 - 12:59 #3
Lease tid skal sættes rimelig højt. Fordi under alle normale omstændigheder
annuleres leasen jo ved checkin.

Man kan jo lave det sådan at samme bruger kan checke ud igen.

Det er helt normalt at source control systemer låser filene til en
bestemt bruger indtil den eksplicit releases.

Den teknok bruges af millioner af brugere over hele verden, så det
virker i praksis. En lille finesse således at låse udløb efter
f.eks. 24 timer er så en ekstra lille finesse. Jeg vil nok iøvrigt
anbefale at checkin blokeres hvis lease er udløbet.
Avatar billede dmk Nybegynder
16. juli 2004 - 13:34 #4
Det er helt rigtigt at source control systemer benytter denne metode, så som SourceSafe, Perforce og CVS.
Men det er ikke et source control system jeg laver, og jeg er ikke sikker på, at teknikken er helt rigtig i min situation. I tidligere versioner af vores software ligger alle dokumenter i filsystemet, og kun stien er registreret i databasen. Her har man fordelen af, at Windows selv håndterer samtidig brug af samme fil, så når man launcher Word får man af vide, at en anden bruger har dokumentet åbent, og at man derfor ikke kan editere det. Hvis en app går ned, frigives "låsen" i windows derfor automatisk.
Jeg er ret sikker på, at jeg ikke får den store tilslutning til explicit checkout/checkin løsninger, når nu brugerne plejer at slippe lettere...

/DMK
Avatar billede arne_v Ekspert
16. juli 2004 - 20:00 #5
Umiddelbart synes jeg at det lyder uløseligt.

På databaseserveren har du kun connections registeret og hvis der bruges
connection pool, så kan du ikke identificere clients ud fra det.
Avatar billede dmk Nybegynder
19. juli 2004 - 09:18 #6
Jeg har fundet ud af, at jeg muligvis kan bruge Login_time sammen med connection ID'et, da login_time jo trods alt bliver opdateret når en connection bliver genbrugt.

Nu er problemet så bare, at det ser ud til visse apps ikke holder sin connection hele programmets levetid, men laver connect ind imellem. *SUK*

/DMK
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester