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

Développement Web en Java Discussion :

Modifier une datasource "à chaud"


Sujet :

Développement Web en Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Mars 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 2
    Par défaut Modifier une datasource "à chaud"
    Bonjour,

    Je suis actuellement stagiaire, et je travaille sur une application utilisant Spring

    Il m'est demandé de trouver une solution pour modifier une data source (en particulier l'url).

    En effet, je dois pouvoir pointer sur différentes bases, en fonction du choix de certains paramètres.

    Actuellement, l'application ne prends en compte qu'une seule base de donnée:

    <bean id="sosdesadvDatasource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName"
    value="java:sosdesadv-as400-ds"/>
    <property name="resourceRef"
    value="false" />
    </bean>

    <bean id="commonJdbcTemplate" class="com.carrefour.fr.sosdesadv.ejb.common.jdbctemplate.CommonJdbcTemplate">
    <property name="dataSource" ref="sosdesadvDatasource"></property>
    </bean>

    Les différentes base de données ont les mêmes structures, seule l'url diffère.

    J'ai pu trouver des pistes avec les attribut proxyinterface et cache du JNDIObjectFacturyBean, mais je ne comprends pas comment "mettre à jour" par la suite ma datasource

    Je ne m'y connais absolument pas à ce niveau et je suis complétement perdu, je sollicite donc votre aide afin de m'indiquer des pistes de réflexions.

    Je vous remercie par avance

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Vous voulez faire quoi quand vous changez de datasource? En général, quand on passe d'une source de données à une autre pour le contenu de l'application, toutes les données en mémoire, qui sont le reflet du contenu de l'ancienne DB doivent être évacuée. Quel que soit le language, ca nécessite un gros boulot. Pour cette raison, en général, on se content de redémarrer l'application concernée.
    Donc en quoi n'est-ce pas une solution acceptable? En gros, si vous voulez vraiment le faire "à chaud", même si spring fournis plus ou mois d'après la doc (voir plus bas) ce genre de possibilité, il va y avoir pas mal d'implications.

    Bref, voila dans Spring (d'après les docs que j'ai pu trouver) comment permettre de changer un bean par un autre (une datasource étant un bean comme un autre)
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <bean id="unBeanQuelconqueUtilisantUneDatasource" ....   
           p:madatasource-ref="sourceSwappable"/>
    <bean id="sourceSwappable" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="targetSource" ref="sourceSwap" />
    </bean>
     
    <bean id="beanSwap" class="org.springframework.aop.target.HotSwappableTargetSource">
        <constructor-arg ref="defaultDatasource" />
    </bean>
    <!-- definir defaultDatasource comme une datasource classique -->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    datasource2 = ...... ; //créer manuellement une nouvelle datasource à partir des méthodes de common dbcp ou en utilisant un bean défini dans le context avec un scope prototype
    HotSwappableTargetSource swappable = context.getBean("beanSwap");
    swappable.swap(datasource2);

  3. #3
    Nouveau candidat au Club
    Inscrit en
    Mars 2011
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 2
    Par défaut
    Merci de votre réponse.

    L'objectif de l'écran en cours de développement, est de permettre à un utilisateur de choisir un entrepôt, ce qui lui permettra d'obtenir certaines données stockées en base. Le problème est que selon l'entrepôt sélectionnée, on ne doit pas pointer sur la même base.

    Le fait d'évacuer les donner lors d'un changement de base n'est pas gênant d'un point de vue fonctionnel.

    En tout cas, merci de m'avoir répondu. Et je reste ouvert à tous compléments d'information

    Cordialement

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    ce serait pas plus simple, au lieu d'injecter une datasrouce dans vos dao et d'essayer de la changer au vol, d'injecter plutot une petit classe utilitaire disposant d'une méthode "getDatasource" qui retourne l'entrepot actuel? vos dao feraient alors appel à entrepots.getDatasource().xxxxxx plutot qu'à datasource.xxxxxx et ca éviterait ce genre de moche bidouille

Discussions similaires

  1. Modification d'un texte dans une fenetre "d'erreur"
    Par PAUL87 dans le forum Access
    Réponses: 8
    Dernier message: 21/10/2005, 13h12

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