Avatar billede ff_j Nybegynder
18. december 2011 - 20:42 Der er 15 kommentarer og
1 løsning

Hvordan undersøger jeg om der kommet nyt datasæt i databasen?

Hey Eksperter

Jeg har et program der på baggrund af data fra mysql databasen køre en lille algoritme.
Men indtil videre har jeg indtastet data manuelt i Mysql.

Det jeg så spørger efter er hvordan jeg får mit java program til at undersøge om der kommet nyt datasæt en gang i minuttet? For derefter at køre min algoritme på ny.

På forhånd tak.
Avatar billede arne_v Ekspert
18. december 2011 - 20:49 #1
Lader dit program forespoerge en gang i minuttt?

:-)
Avatar billede arne_v Ekspert
18. december 2011 - 20:50 #2
Med Oracle/DB2 var der mere avancerede loesninger, men med MySQL tror jeg bare at du skal polle.
Avatar billede kiksen1987 Novice
18. december 2011 - 20:50 #3
Det er lidt svært at gætte hvad du snakker om når du ikke skriver mere end du gør.

Men 1 ting du kunne gøre var at lave et object at hvad du sidst har læst ind i database, så den ligger klar til næste gang du checker. Også når du skal checke din source nyeste data. Lav et Object af den første du checker. sammenlign den nye med den gamle  Object. Så kan du sætte den igang med at hente det hele det hele hvis de 2 ikke er ens.

Men lidt svært at sige hvad du skal gøre. Du giver ikke noget info om hvad det er du henter. Er det nyheder fra et andet site? er det billet priser. Er det Odds? Er det XML du henter? er det forespørgsel i anden Database?

håber det hjalp lidt? :) ellers er du altid velkommen at spørge igen.
Avatar billede ff_j Nybegynder
18. december 2011 - 21:07 #4
Det er måle værdier fra patienter, der bliver gemt af en anden gruppe i en MySQL database, vi skal så hente disse data og køre vores algoritme.

@Arne:
Det gjorde jeg også til at starte med, men programmet kørte for alle eksisterende datasæt.
Og jeg gjorde det ved hjælp af en tråd der sov i et minut, for derefter at genkøre programmet.

Er det muligt med nogle eksempler?

Mange tak for begge svar.
Avatar billede arne_v Ekspert
18. december 2011 - 21:12 #5
Du skal naturligvis lave queries saaledes at de ikke henter for meget data (nemt hvis der er timestamp for last updated i tabellerne).

Jeg ville overveje at bruge timer fremfor en loop med sleep for at undgaa at den drifter fordi processing tager tid.

Et eksempel paa hvad?
Avatar billede ff_j Nybegynder
18. december 2011 - 21:15 #6
På hvordan jeg henter nyeste data ved hjælp af timestamp og en løkke der drifter programmet.

Mange tak for de hurtige svar.
Avatar billede ff_j Nybegynder
18. december 2011 - 21:16 #7
Undskyld en timer i stedet for en løkke.
Avatar billede arne_v Ekspert
18. december 2011 - 21:22 #8
Hvis der er et timestamp i tabellen kan du jo lave en:

SELECT ... WHERE ... AND lastupdated > ?

hvor ? saa er tidspunktet for sidste koersel.
Avatar billede arne_v Ekspert
18. december 2011 - 21:22 #9
Loekken kan drifte, en timer boer ikke kunne drifte.

Det kan jeg godt lave et eksempel paa.
Avatar billede ff_j Nybegynder
18. december 2011 - 21:28 #10
Hvilket format skal "?" være i?

Er det samme format som man har gemt tiden i, altså
12/12/11 12:12:12.

Sådan at query bliver:
SELECT ... WHERE ... AND lastupdated > 12/12/11 12:12:12.

Vil meget gerne se et eksempel på en timer.
Avatar billede arne_v Ekspert
18. december 2011 - 21:29 #11
Brug PreparedStatement og setDate !
Avatar billede ff_j Nybegynder
18. december 2011 - 21:37 #12
Ja setDate() metoden hjælper. Men PreparedStatement skal jeg ikke bruge da jeg kun skal hente data.

Er det muligt at se et eksempel på en timer?

Kast et svar.

Og mange tak for hjælpen.
Avatar billede arne_v Ekspert
18. december 2011 - 21:38 #13
To eksempler som viser forskel paa sleep loop og real timer:


public class SleepLoop {
    private static void dosomething() throws InterruptedException {
        // simulate that it takes some time
        Thread.sleep(100);
    }
    public static void main(String[] args) throws InterruptedException {
        long t = System.currentTimeMillis();
        while(true) {
            dosomething();
            Thread.sleep(1000);
            long t2 = System.currentTimeMillis();
            System.out.printf("%5.3f seconds\n", (t2 - t)/1000.0);
            t = t2;
        }
    }
}



import java.io.IOException;
import java.util.Timer;
import java.util.TimerTask;

public class RealTimer {
    public static void main(String[] args) throws IOException {
        Timer timer = new Timer();
        timer.schedule(new DoSomethingTask(), 1000, 1000);
        System.in.read();
        timer.cancel();
    }
}

class DoSomethingTask extends TimerTask {
    private long t;
    public DoSomethingTask() {
        t = System.currentTimeMillis();
    }
    private static void dosomething() throws InterruptedException {
        // simulate that it takes some time
        Thread.sleep(100);
    }
    public void run() {
        try {
            dosomething();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        long t2 = System.currentTimeMillis();
        System.out.printf("%5.3f seconds\n", (t2 - t)/1000.0);
        t = t2;
    }
}
Avatar billede arne_v Ekspert
18. december 2011 - 21:38 #14
PreparedStatement kan sagtens bruges til en SELECT.
Avatar billede arne_v Ekspert
18. december 2011 - 21:39 #15
Der er eksempler her:

http://www.eksperten.dk/guide/830
Avatar billede arne_v Ekspert
18. december 2011 - 21:39 #16
og et svar
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
Kurser inden for grundlæggende programmering

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