Database programmerings tips
|
|
- Monika Søndergaard
- 5 år siden
- Visninger:
Transkript
1 Denne guide er oprindeligt udgivet på Eksperten.dk Database programmerings tips Denne artikel vil introducere nogle problem stillinger med flere samtidige brugere, som man skal tænke på, når man udvikler en applikatiom som bruger en database. Den forudsætter noget kendskab til SQL og programmering. Skrevet den 14. Feb 2010 af arne_v I kategorien Databaser / Generelt Historie: V1.0-08/07/ original V1.1-12/02/ smårettelser Forudsætning Du kan nok med fordel lige skimme denne artikel først: Indledning Når der er flere samtidige brugere af en database, så er der visse ting man skal tænke over i sit applikations design. Og selvom der ikke umiddelbart er planer om at bruge applikationen i flerbruger sammenhæng, så er det stadig et sundt princip lave sin kode, så den er sikker i en fler bruger sammenhæng. Fordi kode har det med at blive videreudviklet og genbrugt. De efterfølgende eksempler vil primært bruge pseudo kode med SQL til at vise pointerne. Det burde være nemt at implementere denne i enhver database og ethvert applikations sprog. Men der er små forskelle i SQL dialekter som gør at nogle ting skal laves lidt forskelligt i forskellige databaser. Nogen gange vil jeg eksplicit nævne nogle af de mere kendte databaser. Den klassiske fejl som man *aldrig* må lave For at illustrere problem stillingen med flere samtidige brugere, så lad os tage den helt klassiske fejl. Man indsætter i en tabel som selv genererer en primary key og den skal man så bruge til at indsætte i en tabel som foreign key.
2 execute update "INSERT INTO brugere (brugernavn, rigtigtnavn) VALUES (brugernavnsfelt, rigtigtnavnsfelt)" newid = execute query "SELECT MAX(id) FROM brugere" execute update "INSERT INTO statistik (brugerid, n) VALUES (newid, 0)" Og umiddelbart virker den logik jo meget fornuftig. Og en hurtig unit test afslører heller ikke nogen problemer. Der er imidlertid et alvorligt samtidigheds problem. Og et problem som typisk først vil vise sig ved høj belastning (læs: det mest uheldige tidspunkt!). Forestil os to samtidige brugere. bruger 1 bruger INSERT INTO brugere... newid = SELECT MAX(id) FROM brugere INSERT INTO statistik... INSERT INTO brugere... newid = SELECT MAX(id) FROM brugere INSERT INTO statistik... er ikke noget problem. bruger 1 bruger INSERT INTO brugere... INSERT INTO brugere... newid = SELECT MAX(id) FROM brugere newid = SELECT MAX(id) FROM brugere INSERT INTO statistik... INSERT INTO statistik... vil derimod være fatal idet bruger 1's SELECT MAX faktisk vil hente værdien af bruger 2's INSERT. Medmindre koden gør noget specielt, så vil man ikke kunne antage noget som helst om hvordan kode i forskellige processer/tråde udføres i forhold til hinanden. For lige at gøre eksemplet færdigt, så er den korrekte løsning: MS Access: execute update "INSERT INTO brugere (brugernavn, rigtigtnavn) VALUES (brugernavnsfelt,
3 rigtigtnavnsfelt)" execute update "INSERT INTO statistik (brugerid, n) VALUES 0)" MS SQLsServer: execute update "INSERT INTO brugere (brugernavn, rigtigtnavn) VALUES (brugernavnsfelt, rigtigtnavnsfelt)" execute update "INSERT INTO statistik (brugerid, n) VALUES (SCOPE_IDENTITY(), 0)" MySQL: execute update "INSERT INTO brugere (brugernavn, rigtigtnavn) VALUES (brugernavnsfelt, rigtigtnavnsfelt)" execute update "INSERT INTO statistik (brugerid, n) VALUES (LAST_INSERT_ID(), 0)" hvor tricket er at funktionerne SCOPE_IDENTITY() og LAST_INSERT_ID() returnerer den sidste genererede primary key for connection. Og fordi det er per connection så virker det netop i flerbruger sammenhæng også. Oracle og visse andre databaser bruger et helt andet approach baseret på sequences. Generalisering Problemet i sidste afsnit var nemt at løse. Desværre findes der andre problemer som er vanskeligere at løse. Her er et eksempel: saldo = execute query "SELECT saldo FROM konto WHERE kontonr=xxxx" if saldo >= pris then execute update "UPDATE konto SET saldo = saldo - pris WHERE kontonr=xxxx" Den som har studeret eksempelt i sidste afsnit grundigt kan se, at hvis to brugere begge får udført SELECT inden UPDATE så kan saldo faktisk gå i negativ. Og der er ikke nogen smart funktion der kan redde os her. Applikations tråd synkronisering En måde at løse problemet på er at få applikationen til at sikre at der kun er en tråd som kører den kode samtidigt. Java:
4 synchronized(sharedobject) { // kode } C#: lock(sharedobject) { // kode } Det er meget nemt. Men der er også nogle problemer ved løsningen: * det virker kun med en enkelt multithreaded applikation hvilket i praksis betyder en web applikationer som kun kører på en server og som har eksklusiv adgang til de pågældende data * performance er ikke specielt god Så derfor vil man normalt foretrække smartere løsninger som bruger databasen. Transaktioner Inden vi går videre skal vi lige repetere lidt basal viden om transaktioner. Transaktioner er grundliggende en bundtning af flere SQL opdateringer i en enkelt transaktion hvor enten udføres alle opdateringer eller så udføres ingen af dem. Problemet illustreres ved: UPDATE konto SET saldo = saldo - pris WHERE kontonr = a UPDATE konto SET saldo = saldo + pris WHERE kontonr = b Hvad sker der hvis applikationen crasher mellem de 2 SQL sætninger? Tja - penge er forsvundet lige ud i den blå luft. Og bytter man om på de to sætninger er problemet lige så galt, så vil et crash imellem dem betyde at der er opstået penge ud af den blå luft. Løsningen er at bundte de to opdateringer i en transaktion.
5 BEGIN UPDATE konto SET saldo = saldo - pris WHERE kontonr = a UPDATE konto SET saldo = saldo + pris WHERE kontonr = b COMMIT I nogle databaser skal man eksplicit disable auto commit fordi ellers sker der en automatisk commit efter hver opdatering. COMMIT udfører transaktionen. Hvis man fortryder skal man bruge ROLLBACK. Husk at MySQL med MyISAM tabeller ikke understøtter transaktioner. Stort set alle andre databaser og MySQL med InnoDB tabeller understøtter transaktioner. Transaction isolation level Selvom man bruger transaktioner er der stadig potentielle muligheder for samtidigheds problemer. Omfanget af disse afhænger af det valgte transaction isolation level. Standard transaction isolation levels er: Uncommitted Read = ingen isolering overhovedet Committed Read = man kan kun læse data som er committed - ikke nogle midlertidige data som kan blive rollbacked Repeatable Read = de data man har læst kan ikke ændres førend transaktionen er færdig Serializable = som repeatable read men derudover vil der heller ikke kunne tilføjes nye data førend transaktion er færdig Som det ses vil brug af transaction isolation level repeatable read eller serializable løse mange samtidigheds problemer herunder eksemplet ovenfor hvor vi skal undgå at konto saldo bliver negativ. Og vel at mærke på en måde som virker med flere applikationer eller samme applikation kørende på flere servere. Der er dog stadigt et vist performance overhead, da databasen skal låse de rækker/sider som man bruger. Nærlæs din databases dokumentation omkring supporterede transaction isolation levels og default transaction isolation level. Det er kritisk for data integritet. Explicit locking Udover at lade database selv lave låse udfra SQL sætningerne og transaction isolation level så har de fleste databaser også muligheder for at styre låsning via eksplicitte angivelser i SQL sætningerne.
6 Vores tidligere eksempel kunne f.eks. i visse database løses som: BEGIN saldo = execute query "SELECT saldo FROM konto WHERE kontonr=xxxx FOR UPDATE" if saldo >= pris then execute update "UPDATE konto SET saldo = saldo - pris WHERE kontonr=xxxx" COMMIT som vil virke uanset transaction isolation level fordi vi eksplicit låser den record vi selecter. Fordelen ved denne metode er at den normalt vil være mindre ressource krævende for databasen, da vi eksplicit fortæller den hvad den skal låse. Ulempen er at SQL koden ikke er umiddelbart portabel da syntaxen for den slags varierer mellem forskellige databaser. Long time locking Både implicitte låse via transaction isolation level og eksplicitte låse via SQL syntax som f.eks. SELECT FOR UPDATE er short term låse. De er beregnet til at blive holdt i databasen i millisekunder. Og der er normalt timeouts på dem som creater exceptions som applikationen så skal kunne håndtere. Der eksisterer nogle helt andre samtidigheds problemer hvor tiden tælles i minutter eller timer. Et typisk scenarie er: SELECT navn,adresse,postnr FROM kartotek WHERE id=x brugeren retter i et skærm billede i 5 minutter udfra noget papir UPDATE kartotek SET adresse=y,postnr=z WHERE id=x Og det kan også give samtidigheds problemer. bruger 1 bruger SELECT ret UPDATE SELECT ret UPDATE
7 virker bruger 1 bruger SELECT SELECT ret ret UPDATE UPDATE så overskriver bruger 2 de rettelser bruger 1 lavede. Og det kan ikke løses ved nogle af de tidligere beskrevne teknikker, da database låse forlængst ville time ud (eller performance ville gå totalt ned). Long time pessimistic locking Ideen er at sætte en markering af om en række er i brug. Tilføj en kolonne inuse af type BOOLEAN i tabellen og brug den til at markere om en række er i brug. (det er også muligt at bruge en separat lock tabel, men jeg vil holde mig til den simple løsning her) Logikken kan implementers på flere forskellige måder. Med SELECT + UPDATE i en transaktion med passende højt transaction isolation level: BEGIN inuse = execute query "SELECT inuse FROM kartotek WHERE id=x" if inuse then informer bruger om at det ikke er muligt at editere else execute update "UPDATE kartotek SET inuse=true WHERE id=x" execute query "SELECT navn,adresse,postnr FROM kartotek WHERE id=x" COMMIT brugeren editerer data UPDATE kartotek SET adresse=y,postnr=z,inuse=false WHERE id=x
8 Med kun UPDATE hvis man kan få returneret antal modificerede rækker: rowsmodified = execute update "UPDATE kartotek SET inuse=true WHERE id=x AND NOT inuse" if rowsmodified = 0 then informer bruger om at det ikke er muligt at editere else execute query "SELECT navn,adresse,postnr FROM kartotek WHERE id=x" brugeren editerer data execute update "UPDATE kartotek SET adresse=y,postnr=z,inuse=false WHERE id=x" Ulemperne ved pessimistic locking er: * der er overhead ved den ekstra opdatering * hvis en bruger henter data man aldrig gemmer data igen så forbliver inuse flaget sat og man har brug for en cleanup process Long time optimistic locking Ideen er at checke om data er blevet ændret af en anden bruger siden man selv hentede data når man gemmer sin rettelse. Tilføj en kolonne version af type INTEGER i tabellen og brug den til tælle op for ændringer. Logikken kan implementers på flere forskellige måder. Med SELECT + UPDATE i en transaktion med passende højt transaction isolation level: execute query "SELECT navn,adresse,postnr,version FROM kartotek WHERE id=x" myversion = result[version] brugeren editerer data BEGIN currentversion = execute query "SELECT version FROM kartotek WHERE id=x" if currentversion = myversion then UPDATE kartotek SET adresse=y,postnr=z,version=version+1 WHERE id=x else informer bruger om at det ikke er muligt at gemme data COMMIT
9 Med kun UPDATE hvis man kan få returneret antal modificerede rækker: execute query "SELECT navn,adresse,postnr,version FROM kartotek WHERE id=x" myversion = result[version] brugeren editerer data rowsmodified = execute update "UPDATE kartotek SET adresse=y,postnr=z,version=version+1 WHERE id=x AND version=myversion" if rowsmodified = 0 then informer bruger om at det ikke er muligt at gemme data Performance er bedre ved optimistic locking end ved pessimistic locking. Ulemperne ved optimistic locking er: * den bruger der forsøge at gemme sidst skal starte forfra med sine rettelser Derfor anbefales optimistic locking normalt kun hvis sandsynligheden for at to vil forsøge at rette i samme data er tilpas lille. Visse database har indbygget en datatype for den slags versions nummer. Kommentar af arriva d. 11. Jul Giver en god indsigt i de problemer der kan opstå ved flerbrugersystemer hvis man ikke tænker sig om. Kommentar af trp79 d. 12. Jul Endnu en informativ og let læselig artikel - bliv endelig ved i den dur Arne. Mvh trp79 Kommentar af qtax87 (nedlagt brugerprofil) d. 21. Aug God artikel, dem må vi have nogen flere af fra arne_v. Kommentar af imago-dei d. 19. Jul Fin artikel. Jeg vil dog tilføje at flere databaser (i hvert fald MSSql og Oracle) kan udlevere en timestamp eller en rowversion, som er unik for hver record, og bliver opdateret af basen ved insert og update. På den måde kan du lave concurrency check (det som du kalder "Long time optimistic locking" uden at have besværet med at selv opdatere rowversion. Kommentar af trer d. 09. Jul Rigtig fin artikel - og gid alle udviklere ville læse den :-)
10 Kommentar af speedpete d. 01. Nov Kommentar af sharon (nedlagt brugerprofil) (nedlagt brugerprofil) d. 11. Jul kanon god artikel for dem der er ny i SQL, så man ikke laver en masse basale fejl //sharon Kommentar af emmo d. 07. Apr Rigtig god artikel, ja dem vil vi gerne se nogle fler af.
Introduktion til SQL queries
Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til SQL queries Denne artikel beskriver nogle forskellige muligheder i SQL queries. Eksemplerne skulle gerne være standard SQL og virke i
Læs mereDatabase design for begyndere
Denne guide er oprindeligt udgivet på Eksperten.dk Database design for begyndere Denne artikel beskriver hvordan man kommer fra ide til database design. Den stopper inden normal former. Den forudsætter
Læs merePrepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.
Denne guide er oprindeligt udgivet på Eksperten.dk Prepared Statements Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC. Skrevet den 18. Feb 2010
Læs mereDatabase tips. Den forudsætter lidt kendskab til SQL men er for mindre erfarne. Denne guide er oprindeligt udgivet på Eksperten.dk
Denne guide er oprindeligt udgivet på Eksperten.dk Database tips Denne artikel vil give nogle forskellige små praktiske råd om ting man skal tænke på når man arbejder med databaser og applikationer som
Læs mereSQL for MySQL-begyndere
Denne guide er oprindeligt udgivet på Eksperten.dk SQL for MySQL-begyndere I denne artikel vil jeg prøve at beskrive MySQL på begynderniveau. SQL står for Structured Query Language, og er et sprog til
Læs mereParameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.
Denne guide er oprindeligt udgivet på Eksperten.dk Parameters Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET. Der findes en tilsvarende artikel med
Læs mereSkrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET
Denne guide er oprindeligt udgivet på Eksperten.dk Parameters Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til VB.NET og ADO.NET. Der findes en tilsvarende artikel
Læs mereI mit script tager jeg højde for det problem ved, at gemme et unikt tal mellem 0-9 på 6 cifre og derved vil de så blive vist som 2 online.
Denne guide er oprindeligt udgivet på Eksperten.dk Hvem er online? Online script, som tager højde for at der kan være flere personer, som har den samme IP-adresse. Scriptet viser hvor lang tid brugeren
Læs mereMySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.
Denne guide er oprindeligt udgivet på Eksperten.dk MySQL C API Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere. Den forudsætter lidt kendskab
Læs mereapplikation----x----odbc driver manager----foobar ODBC driver----foobar database
Denne guide er oprindeligt udgivet på Eksperten.dk ODBC i C/C++ Denne artikel beskriver hvordan man bruger ODBC i C/C++. Der er beskrivelse af build med forskellige compilere. Den forudsætter lidt kendskab
Læs mereViews. Et view er en relation defined ud fra gemte tabeller ( base tables ) og andre views To typer:
Views 1 Views Et view er en relation defined ud fra gemte tabeller ( base tables ) og andre views To typer: 1. Virtual = Ikke gemt i databasen; kun definitionen af den 2. Materialized = Date konstrueret
Læs mereArkitektur for begyndere
Denne guide er oprindeligt udgivet på Eksperten.dk Arkitektur for begyndere Denne artikel beskriver forskellige basale n-tier arkitekturer. Som man bør kende og have valgt inden man går igang med at udvikle
Læs mereViews etc. Databaser
Views etc. Databaser Views Med Views kan vi gemme nogle af de lange select sætninger. I vores eksempel fra tidligere er det f.eks. forbundet med en del besvær at finde telefon nr og bilmærker for en sælger
Læs mereKontrol-strukturer i PHP
Denne guide er oprindeligt udgivet på Eksperten.dk Kontrol-strukturer i PHP Denne artikel gennemgår kontrolstrukturer i PHP. 'if', 'switch', 'while' og 'for' bliver gennemgået. Den forudsætter lidt grundlæggende
Læs mereLoginsystem (med MySQL)
Denne guide er oprindeligt udgivet på Eksperten.dk Loginsystem (med MySQL) Dette er en guide til, hvordan man kan lave et loginsystem med php og muligvis også med sessioner og MySQL Skrevet den 02. Feb
Læs mereRatingsystem i PHP og MySQL
Denne guide er oprindeligt udgivet på Eksperten.dk Ratingsystem i PHP og MySQL Lær at lave et system til at vise rating/bedømmelse på artikler og nyheder. Skrevet den 03. Feb 2009 af virtual1ty I kategorien
Læs mereSingleton pattern i Java
Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i Java Denne artikel beskriver Singleton pattern og implementation i Java. Den forudsætter kendskab til Java men ikke til Singleton.
Læs mereBegrænsninger i SQL. Databaser, efterår 2002. Troels Andreasen
Databaser, efterår 2002 Begrænsninger i SQL Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk
Læs mereSend fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.
Denne guide er oprindeligt udgivet på Eksperten.dk Send email fra Java Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende email fra Java. Simple eksempler ikke noget vildt
Læs mereListen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:
Denne guide er oprindeligt udgivet på Eksperten.dk SQL og ASP En artikel omkring simpel SQL og hvordan disse opbygges, udformes og udføres, sådan at man kan få et brugbart resultat i ASP. Dette ligefra
Læs mereIntroduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach (jeans@ruc.dk) 2002
Introduktion til Oracle, Datalogi, RUC Af: Jens Lauterbach (jeans@ruc.dk) 2002 På datalogi har vi en databaseserver, som de studerende på datalogi kan benytte til projekter og som også benyttes i forbindelse
Læs mereDatabaseadgang fra Java
Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,
Læs mereTagwall med Php & MySQL
Denne guide er oprindeligt udgivet på Eksperten.dk Tagwall med Php & MySQL Her laver vi en tagwall i Php & MySQL... jeg forklarer dog ikke så meget, men jeg håber du kan få det til at blive til en tagwall
Læs mereForskellige Java versioner
Denne guide er oprindeligt udgivet på Eksperten.dk Forskellige Java versioner Denne artikel beskriver lidt om de forskellige Java versioner. Den forklarer J2SE/J2ME/J2EE, plugin/jre/sdk og Sun Java/Microsoft
Læs mereUploade billeder eller andre filer ved hjælp af php og mysql
Denne guide er oprindeligt udgivet på Eksperten.dk Uploade billeder eller andre filer ved hjælp af php og mysql Denne artikel viser hvordan man kan uploade et billede eller en anden fil, og tilknytte det
Læs mereEn Kort Introduktion til Oracle
En Kort Introduktion til Oracle Henrik Bulskov 12. februar 2001 bulskov@ruc.dk 1 Start SQL*Plus... 1 1.1 TELNET... 1 1.2 WINDOWS SQL PLUS... 2 2 Kør et SQL-script... 3 3 Hjælp i SQL*Plus... 3 4 Editering
Læs mereSom sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste
Denne guide er oprindeligt udgivet på Eksperten.dk Indkøbsvogn i PHP I denne artikel vil jeg prøve at lave en indkøbskurv som let kan udvides, og som ikke er svær at forstå. Det er bedst med viden om OOP(klasser),
Læs mereI denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.
Denne guide er oprindeligt udgivet på Eksperten.dk Grundlæggende PHP I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.
Læs mereDen forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.
Denne guide er oprindeligt udgivet på Eksperten.dk Brug af MySQL i C++ Denne artikel bygger ovenpå artiklen "MySQL C API" og forklarer hvordan man kan programmere mere objekt orienteret. Den forudsætter
Læs mereTilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.
Denne guide er oprindeligt udgivet på Eksperten.dk Tilfældige tal Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge. Den forudsætter
Læs mereDe vigtigste SQL-sætninger. SQL kap Oprette database. DDL og DML
SQL kap 6-7 + 17-20 DDL og DML 1 De vigtigste SQL-sætninger Data Definition Language (DDL) create table: opretter en ny tabel create unique index: tilføjer et index til en tabel drop table : sletter en
Læs mereDatabasesystemer. IT Universitetet i København 7. juni 2005
Databasesystemer IT Universitetet i København 7. juni 2005 Eksamenssættet består af 5 opgaver med 13 spørgsmål, fordelt på 6 sider (inklusiv denne side). Vægten af hver opgave er angivet. Du har 4 timer
Læs mereParameterisering af databasekald med ASP og ADO
Denne guide er oprindeligt udgivet på Eksperten.dk Parameterisering af databasekald med ASP og ADO Jeg har efterhånden set en del spørgsmål her på Eksperten vedr. SQL injections og hvordan man kan beskytte
Læs mereGæstebog med validering opbygget med MySQL
Denne guide er oprindeligt udgivet på Eksperten.dk Gæstebog med validering opbygget med MySQL Dette er en simpel gæstebog, som kan hjælpe folk med at lave en velfungerende gæstebog uden alt for meget arbejde.
Læs mereIndholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:...
Indholdsfortegnelse Databaser og PHP... 3 Opgave... 4 Opgave... 5 Opgave... 6 Sidste opgave er en lille gæstebog... 7 Kilder og nyttige links:... 9 Nogle HTML tags... 9 Databaser og PHP Når vi snakker
Læs merePHP 3 UGERS FORLØB PHP, MYSQL & SQL
PHP 3 UGERS FORLØB PHP, MYSQL & SQL Uge 1 & 2 Det basale: Det primære mål efter uge 1 og 2, er at få forståelse for hvordan AMP miljøet fungerer i praksis, og hvordan man bruger PHP kodesproget til at
Læs mereThreads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java
Denne guide er oprindeligt udgivet på Eksperten.dk Threads i Java Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Den forudsætter
Læs mereArrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP
Denne guide er oprindeligt udgivet på Eksperten.dk Arrays i PHP De fleste som har skrevet omfattende scripts, er før eller siden stødt på problemet med at de bliver vanskelige at overskue hvis man bruger
Læs mereLogging i Java. Den forudsætter kendskab til Java og noget generel udviklings erfaring. Denne guide er oprindeligt udgivet på Eksperten.
Denne guide er oprindeligt udgivet på Eksperten.dk Logging i Java Denne artikel beskriver baggrunden for logging frameworks og viser hvordan man bruger 2 af de mest almindelige: Apache Log4J og J2SE/Java
Læs mereOPC ACCESS HEARTBEAT 1
OPC Access Heartbeat Dette dokument gennemgår i et kort eksempel, hvordan OPC Access konfigureres til at anvende Heartbeat funktionen til at dokumentere kontinuerlig forbindelse mellem SQL Server og OPC
Læs mereSingleton pattern i C#
Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i C# Denne artikel beskriver Singleton pattern og implementation i C#. Den forudsætter kendskab til C# men ikke til Singleton. Der er
Læs merePHP Pagination. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 01. May 2011 af dab93 I kategorien Programmering / Andre
Denne guide er oprindeligt udgivet på Eksperten.dk PHP Pagination I denne guide lærer du om at lave et pagination system med programmerings sproget PHP og MySQL database. Et pagination system er en "side-skiftende"
Læs mereDelphi og Databaser for begyndere
Denne guide er oprindeligt udgivet på Eksperten.dk Delphi og Databaser for begyndere Denne artikel handler om hvordan man udnytter noget af det bedste i Delphi: Dets gode muligheder for integrering med
Læs mereDerfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer
Denne guide er oprindeligt udgivet på Eksperten.dk TreeView i Access II Jeg vil i denne anden udgave af treeview føljetonen begynde på et mere brugbart eksempel med et TreeView. Vi laver en ny database
Læs mereDatabase optimering - Indeks
Database optimering - Indeks Alle kender til dette irritations moment, hvor programmet man sidder og arbejder med, bare ikke er hurtigt nok. Selvom det kun drejer sig om få sekunder man sidder og venter,
Læs mereSkriftlig opgave. Designtanker i database-nære systemer
Skriftlig opgave til eksamen for faget»databaser«designtanker i database-nære systemer Martin Ancher Holm Juni 2010 1 Intro Denne skriftlige opgave indeholder kort de daglige tanker jeg har omkring design
Læs mereJava web applikationer med Tomcat
Denne guide er oprindeligt udgivet på Eksperten.dk Java web applikationer med Tomcat Denne artikel beskriver hvordan man kan konfigurere container managed security og en database connection pool i Tomcat.
Læs mereImport af rekursivt (parent-child) hierarki i Palo
Import af rekursivt (parent-child) hierarki i Palo Dette dokument beskriver hvordan et simpelt rekursivt (parent-child) hierarki kan importeres ind i Palo på forskellige måder via SQL og samtidig bibeholde
Læs mereDatabasesystemer. IT Universitetet i København 16. januar 2006
Databasesystemer IT Universitetet i København 16. januar 2006 Eksamenssættet består af 5 opgaver med 16 spørgsmål, fordelt på 6 sider (inklusiv denne side), samt et svarark, hvor visse spørgsmål skal besvares.
Læs mereI denne artikel vil jeg gennemgå hvordan en side for RSS "Live Bogmærke" kan se ud.
Denne guide er oprindeligt udgivet på Eksperten.dk RSS "Live Bogmærke" I denne artikel vil jeg gennemgå hvordan en side for RSS "Live Bogmærke" kan se ud. Skrevet den 10. Feb 2009 af madsass I kategorien
Læs mereBegrynder til at lave log ind system
Denne guide er oprindeligt udgivet på Eksperten.dk Begrynder til at lave log ind system Hej Vil jeg gerne lave en lille programmering forklare til hvordan du laver din helt egen lille start på at log ind
Læs mereBemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse.
Mysqli Webintegrator Når vi arbejder med server-side scripting ( i vort tilfælde PHP), har vi ofte behov for at kunne tilgå data, som vi opbevarer i en database. Det kan f.eks. dreje sig om nyhederne i
Læs mereVærktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune
Værktøjer fra værktøjskassen Søren Breddam, Stevns Kommune sb@stevns.dk 1stevns kommune Mapbasic i Stevns Kommune Data Kørsel af planlagte opgaver, så data altid er opdaterede. Logfil til overvågning Dagligt
Læs mereIT projekt person galleri
Denne guide er oprindeligt udgivet på Eksperten.dk IT projekt person galleri Denne artikel forsøger at forklare lidt om hvilke funktioner der ligger bag ved de forskellige titler som deltagerne i et IT
Læs mereDenne artikel gennemgår kort nogle mulighederne for brug af XML i ASP. Det sker ved brug af eksempler. Eksemplerne vil være i VBS.
Denne guide er oprindeligt udgivet på Eksperten.dk XML i ASP Denne artikel gennemgår kort nogle mulighederne for brug af XML i ASP. Det sker ved brug af eksempler. Eksemplerne vil være i VBS. Den forudsætter
Læs mereRMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).
Denne guide er oprindeligt udgivet på Eksperten.dk RMI introduktion Denne artikel beskriver Java RMI (Remtote Method Invocation). Den beskriver teorien bag RMI, viser et simpelt kode eksempel og forklarer
Læs mereDatabase "opbygning"
Database "opbygning" Dette områder falder mest under en DBA's ansvarsområde. Det kan sagtens tænkes at en database udvikler i nogle situationer vil blive nød til at oprette produktions og test) databaser,
Læs mereProcesbeskrivelse - Webprogrammering
Procesbeskrivelse - Webprogrammering Indholdsfortegnelse Forudsætninger... 1 Konceptet... 2 Hjemmesiden... 2 Server-side... 3 Filstrukturen... 3 Databasehåndtering og serverforbindelse... 4 Client-side...
Læs mereMed register_globals = On får du automatisk adgang til en række variabelnavne i dit script.
Denne guide er oprindeligt udgivet på Eksperten.dk Register Globals Off Lad os slå en ting fast med det samme - register_globals = Off er en god ting, i hvert fald set ud fra et sikkerhedsmæssigt synspunkt.
Læs mereDen forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.
Denne guide er oprindeligt udgivet på Eksperten.dk Brug af XML i VB.NET Denne artikel vil vise lidt om hvordan man kan bruge XML i VB.NET. Den forudsætter kendskab til XML og VB.NET men ikke til brug af
Læs mereData lagring. 2. iteration (implement backend)
Data lagring 2. iteration (implement backend) Emner Grundlæggende database begreber. Data definitionskommandoer ER-diagrammer og cardinalitet/relationer mellem tabeller Redundant data og Normalisering
Læs mereDynamisk PHP design OPDATERET
Denne guide er oprindeligt udgivet på Eksperten.dk Dynamisk PHP design OPDATERET I har måske undret jer over "http://bla.dk/?side=kontakt", her beskriver jeg hvordan, og hvorfor Skrevet den 03. Feb 2009
Læs mereSeptimas høringssvar vedrørende dokumenteterne FKG datamodellen - Version 2 3 1 - Fysisk implementering.pdf og FKG_2_3_1_mssql.sql
Septima P/S Larsbjørnsstræde 3 1454 København K +45 7230 0672 www.septima.dk 31. juli 2013 Septimas høringssvar vedrørende dokumenteterne FKG datamodellen - Version 2 3 1 - Fysisk implementering.pdf og
Læs mereBits, bit operationer, integers og floating point
Denne guide er oprindeligt udgivet på Eksperten.dk Bits, bit operationer, integers og floating point Denne artikel beskriver hvordan data gemmes som bits og hvordan man kan manipulere med bits. Den forudsætter
Læs mereAfsending af s vha. ASP
Denne guide er oprindeligt udgivet på Eksperten.dk Afsending af emails vha. ASP Det kan ofte være praktisk at afsende emails fra sin hjemmeside. Denne artikel tager udgangspunkt i komponenten JMail fra
Læs mereA11: Last Year s Exam
A11: Last Year s Exam Agenda Design of Site map and Web- structure (3) Design of data model (1) Design of database transactions (2) Construction of HTML and PHP scripts (3) Exercise 3: Design of Site map
Læs mereMsSQL: Basal performance tuning, part 1
Denne guide er oprindeligt udgivet på Eksperten.dk MsSQL: Basal performance tuning, part 1 Hvordan man skriver "God SQL" for bedre performance. Skrevet den 03. Feb 2009 af trer I kategorien Databaser /
Læs mereDen forudsætter kendskab til XML og C# men ikke til brug af XML i C#.
Denne guide er oprindeligt udgivet på Eksperten.dk Brug af XML i C# Denne artikel vil vise lidt om hvordan man kan bruge XML i C#. Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.
Læs mereDatabasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002
Databaser, efterår 2002 Databasesystemer Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk
Læs mereSådan skriver du artikler til Eksperten!
Denne guide er oprindeligt udgivet på Eksperten.dk Sådan skriver du artikler til Eksperten! Når du skriver artikler handler det om at få den ud til de rigtige personer, og vise den frem så den er let forståelig.
Læs mereIntroduktion til OPC Access
Introduktion til OPC Access OPC Access anvendes til at kommunikere med jeres produktionsudstyr via OPC. OPC Access kombinerer en SQL Server med OPC, således at jeres produktionsudstyr kobles sammen med
Læs mereOPC Access 3.0 opdatering via Stored Procedure
OPC Access 3.0 opdatering via Stored Procedure Dette dokument gennemgår et eksempel på, hvordan OPC Access 2.0 kan konfigureres til at opdatere en database via en stored procedure. OPC ACCESS 2.0 OPDATERING
Læs mereEksempel på en database: studenter, kurser, eksamener
Udvidet Programmering 1999 Forelæsning 20, fredag 12. november 1999 Relationsdatabaser: relationer, tupler, attributter Forespørgselssproget SQL Databasesystemet PostgreSQL Tilgang til relationsdatabaser
Læs mereAnvisning i aflevering af bitemporale data
UDKAST udgivet juni 2019 Anvisning i aflevering af bitemporale data Baggrund Aflevering af data fra it-systemer til et offentligt arkiv er baseret på aflevering af en arkiveringsversion i en relationel
Læs mereDB undervisning 01-01
Databaser... 2 Tabeller... 2 Redundans... 3 Første regel... 4 Anden regel... 4 Tredje regel... 5 Relationer... 5 Opskrift... 6 SQL sætninger til at oprette tabeller... 7 SQL sætninger til at indsætte data...
Læs mereMåske kender du nogle af de tips og tricks, guiden indeholder, men så bliver du blot bekræftet i, at du gør det rigtige.
JETREPORTS TIPSOG TRICKS Indledning Jet Reports er et fantastisk rapporteringsværktøj integreret i Excel. De fleste af os bruger nok kun en brøkdel af de muligheder som Jet Reports og Excel har. Denne
Læs mereHvorfor skal vi bruge objekt orienteret databaser?
OODBMS Vs. RDBMS 1 Indholdsfortegnelse Hvorfor skal vi bruge objekt orienteret databaser?... 3 OODBMS i erhvervslivet... 4 Bagsiden af medaljen... 5 OODBMS i praksis... 6 Konklusion... 8 2 Hvorfor skal
Læs mereAt klippe en streng over på det mest hensigtsmæssige sted
Denne guide er oprindeligt udgivet på Eksperten.dk At klippe en streng over på det mest hensigtsmæssige sted Formålet med denne artikel er at kaste lidt lys over, hvordan man klipper en streng over på
Læs mereFlerbruger miljø, opdel database
Denne guide er oprindeligt udgivet på Eksperten.dk Flerbruger miljø, opdel database Denne artikel henvender sig primært til begyndere og let øvede brugere af Access der ønsker at vide noget om flerbruger
Læs mereGør Administrator-brugeren til almindelig bruger
Denne guide er oprindeligt udgivet på Eksperten.dk Gør Administrator-brugeren til almindelig bruger Guide til at fjerne den indbyggede administrator fra administratorgruppen. Det kræver et rimeligt godt
Læs mereLoginsystem med PHP4, klasser, sessions og MySQL database
Denne guide er oprindeligt udgivet på Eksperten.dk Loginsystem med PHP4, klasser, sessions og MySQL database Artiklen indeholder et simpelt loginsystem, der benytter en klasse. Den er med vilje simplificeret,
Læs mereDatabasesystemer. IT Universitetet i København 8. juni 2006
Databasesystemer IT Universitetet i København 8. juni 2006 Eksamenssættet består af 5 opgaver med 16 spørgsmål, fordelt på 7 sider (inklusiv denne side), samt et svarark, hvorpå visse spørgsmål skal besvares.
Læs mereSQL Server 2016 Data Adgang
SQL Server 2016 Data Adgang MSBIP, 5. OKTOBER, 2015 Agenda SQL Server 2016 CTP 2.3 Pragmatisk Data Adgangskontrol Row Level Security Dynamic Masking Kombination af begge Alternativet Hvem er jeg Selvstændig
Læs mereModerne SAS-programmering på webben med SAS Studio. Georg Morsing SAS Institute
Moderne SAS-programmering på webben med SAS Studio Georg Morsing SAS Institute SAS-programmering med SAS Display Manager 1985 2015 Den nye SAS program editor i SAS Enterprise Guide August 2010 SAS Enterprise
Læs mereFå sin querystring til at fungere. (Nybegyndere)
Denne guide er oprindeligt udgivet på Eksperten.dk Få sin querystring til at fungere. (Nybegyndere) Artikelen henvender sig til nybegyndere der har problemer med at få sin querystring til at fungere (Access/ASP).
Læs mereExceptions i Delphi. Try except
Exceptions i Delphi Exceptions er en teknik til at fange fejl under programafviklingen. Ikke programmeringsfejl, men fejl der opstår i forskellige situationer, f.eks. en fil der mangler en fil der er skrivebeskyttet,
Læs mereDatabasesystemer fra forskellige synsvinkler
Databasesystemer fra forskellige synsvinkler Kim Skak Larsen kslarsen@imada.sdu.dk IMADA DM534 Introduktion til datalogi, 8/10 2015 p.1/60 Oversigt Introduktion Del 1: en designers synsvinkel Del 2: en
Læs mereEndnu mere om tilfældige tal
Denne guide er oprindeligt udgivet på Eksperten.dk Endnu mere om tilfældige tal Denne artikel bygger oven på de to forrige artikler om tilfældige tal. Den indeholder lidt matematik og anvendelse på PHP
Læs mereEksamen, DSDS, efterår 2007
Eksamen, DSDS, efterår 2007 Introduktion til Scripting, Databaser og Systemarkitektur Jonas Holbech og Martin Elsman IT Universitetet i København 7. januar 2008 Alle hjælpemidler er tilladte, dog ikke
Læs mereVÆR EFFEKTIV SOM SAS PROGRAMMØR MED SAS ENTERPRISE GUIDE 7.12 GEORG MORSING
VÆR EFFEKTIV SOM SAS PROGRAMMØR MED SAS ENTERPRISE GUIDE 7.12 GEORG MORSING Copyr i g ht 2013, SAS Ins titut e Inc. All rights res er ve d. Livet som SAS-programmør er blevet lettere med SAS Enterprise
Læs mereLogning. V/ Hans Kennet Larsen
Logning V/ Hans Kennet Larsen Lidt om mig Ansat i Sonlinc fra august 1992 September 2008 Stort set alle hatte på Fra Oktober 2008 Juni 2011 Traceworks Databaseudvikler + Backendudvikler Scrummaster Juli
Læs mereDesign Diaries.
Design Diaries http://blog.lykkeeilert.dk/ Patricia Gambula Larsen Patrick Lykke Eilert Ninette Andersen cph-pl130@cphbusiness.dk cph-pe58@cphbusiness.dk cph-na96@cphbusiness.dk INDHOLD Use case model
Læs mereBrugerdefineret menuer i Access
Denne guide er oprindeligt udgivet på Eksperten.dk Brugerdefineret menuer i Access Denne artikel henvender sig primært til let øvede brugere af Access, der ønsker at komme i gang med at tilpasse egne menuer
Læs mereMicrosoft Log Parser, Windows logfil analyse
Denne guide er oprindeligt udgivet på Eksperten.dk Microsoft Log Parser, Windows logfil analyse Microsoft's logfiler er ikke lette at bruge. med Microsoft Log Parser, har du alle muligheder. Log parser
Læs mereQuick Guide Ditmer edagsorden Oktober 2013
Quick Guide Ditmer edagsorden Oktober 2013 Quick Guide Indhold For dig der skal i gang med at bruge ditmer edagsorden på ipad eller web 1. Sådan får du adgang til ditmer edagsorden... 2 2. Find udvalg
Læs mere//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!
Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for
Læs mereHej alle sammen, nu fjerner vi lige mystikken om alle de "ulovlige tags" her på eksperten.dk
Denne guide er oprindeligt udgivet på Eksperten.dk Tags på Eksperten.dk Hej alle sammen, nu fjerner vi lige mystikken om alle de "ulovlige tags" her på eksperten.dk Skrevet den 30. okt 2009 af mbm2007
Læs mereFilen global.asa, en asp programmørs ven
Denne guide er oprindeligt udgivet på Eksperten.dk Filen global.asa, en asp programmørs ven Artiklen beskriver opbygning, brug, muligheder og begrænsninger mm for global.asa Undervejs bliver der givet
Læs mereRMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.
Denne guide er oprindeligt udgivet på Eksperten.dk RMI avanceret Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer. Den forudsætter
Læs mere