IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Streaming de données depuis DB, besoin de conseils !


Sujet :

avec Java

  1. #1
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut Streaming de données depuis DB, besoin de conseils !
    Bonjour à tous !

    Je suis débutant en Java et je me suis lancé dans un projet un peu compliqué pour moi.
    Si vous le voulez bien, je vais vous expliquer de quoi il s'agit, puis vous présenter comment je compte m'y prendre : je vais avoir quelques questions et j'aimerais un avis de qqn qui connait bien java


    J'enregistre chaque nuit la bourse Coréenne, pour être plus précis j'enregistre en base, chaque mouvement (bid, ask, trade et volumes) qu'il peut y avoir sur toutes les options sur leur indice principal (le KOSPI).

    Le but de mon projet est de diffuser en temps réel différé les données vers mes outils d'analyses, afin de pouvoir observer la bourse et dormir la nuit .

    Pour vous donner une idée, une journée représente en base, une table de 300 MO (3 millions de lignes)





    En effet, je veux reproduire les mouvements et leur timing, (de l'ordre de la milliseconde), mais j'ai peur que : (là j'attends vos avis) :

    de tout charger dans un Statement, puis de lire le statement
    1°) ne soit trop gourmand en mémoire
    2°) ne me permette pas de lire à la "bonne" vitesse, sachant que j'ai parfois des grappes de mouvements qui sont tous dans la même milliseconde

    c'est pourquoi j'ai imaginé de mettre les mouvements dans une liste chainée, qui sera remplie d'un côté par un Lecteur et dépilée de l'autre par un Diffuseur (qui balancera les infos). Au pire, quand le Diffuseur aura rattrapé le Lecteur, de le freezer un peu le temps que le Lecteur reprenne de l'avance.
    Mais ça ne rêgle pas le problème du Statement SQL : est-ce qu'il va pouvoir gérer 3 millions de lignes ?

    Sinon, on m'a dit que la fonction sleep n'était pas fiable sous les 15 millisecondes et qu'il vallait mieux considérer qu'il faut diffuser tout de suite tous les mouvements espacés de moins de 20 millisecondes.
    Qu'en pensez-vous ?


    Merci de vos avis !

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Hello,

    je suis pas sûr, mais je crois que la notion de "streaming" est déjà implémentée au niveau des statements/resultset. Pourquoi je pense ça? bin simplement parce que la plupart des statements que l'on récupère avec une connexion distante à la base de données sont en mode FORWARD_ONLY (je me souviens plus vraiment des terminologies exactes)

    En fait, quand tu parcours le contenu d'un resultset, tu n'as pas la possibilité de le réinitialiser (de revenir au début du resultset), enfin de mémoire pas par défaut: si tu essaie cela balance une exception, cela sous-entend que le resultset est déjà connecté à un stream et que seule une petite partie des données est disponible à chaque instant.

    Bon, encore une fois, je ne suis pas vraiment sûr, cela dépend également du driver jdbc utilisé et de la manière dont tu créé tes statements/resultset. Les tests que j'avais fait sous mysql (il y a déjà longtemps maintenant) produisaient les résultats évoqués ci-dessus.

    Ensuite, la fonction sleep (si tu parles bien de Thread#sleep), comme toutes les fonctions gérant le temps en java, sont directement liées à l'OS: or, sous windoz, la "résolution" ne vas pas au-dela de 15-16 ms. De plus, Thread#sleep garantit une attente minimum de x ms, mais en fonction de la charge des autres thread, ce temps peut être bien plus élevé. Il n'existe rien de vraiment précis en java pour imposer une attente (justement à cause du multithread).

    Le mieux est encore d'essayer...

    "Le plug gros problème des citations trouvées sur internet, c'est qu'on ne peut jamais garantir leur authenticité"

    Confucius, 448 av. J-C

  3. #3
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    Merci de ta réponse Phil_S !

    Pour le sleep, tant pis je ferai avec

    J'ai eu le retour de collègues qui travaillent en java sur le même genre de problématique, et ils ont dû développer un système un peu analogue à mon idée, plutôt que de diffuser directement depuis le Statement SQL, parce qu'il ne lisait pas assez vite : c'est pourquoi je suis parti sur mon histoire de liste chainée.
    Mais j'aimerais tellement que le Statement fasse lui même le "streaming"... quelqu'un sait ?

  4. #4
    Membre confirmé Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Mathusalem Voir le message
    Mais j'aimerais tellement que le Statement fasse lui même le "streaming"... quelqu'un sait ?
    Oui, les données sont rapatriées par le driver dans la JVM au fur et à mesure que tu vas parcourir ton ResultSet. C'est d'ailleurs configurable : http://java.sun.com/j2se/1.4.2/docs/api/java/sql/ResultSet.html#setFetchSize(int)
    Et pas de problème pour récupérer 3 millions de lignes, tant que tu ne garde pas tout en mémoire à un instant donné, (sauf si tu en as besoin mais que tu taille suffisamment la JVM).

  5. #5
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    merci de ta réponse !

    je vais regarder ça en détail

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/10/2013, 20h31
  2. Besoin de conseil sur création base de données
    Par saf28 dans le forum Débuter
    Réponses: 6
    Dernier message: 09/07/2012, 11h47
  3. [Toutes versions] Besoin de conseil sur la modelisation d'une base de données
    Par Bluuuh dans le forum Modélisation
    Réponses: 3
    Dernier message: 20/05/2010, 09h35
  4. [CR7]Actualisation des données depuis VB
    Par elifqaoui dans le forum SDK
    Réponses: 4
    Dernier message: 24/11/2003, 13h44
  5. Réponses: 1
    Dernier message: 06/01/2003, 07h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo