Multi connexion sur une BDD

Signaler
Messages postés
74
Date d'inscription
vendredi 4 juillet 2003
Statut
Membre
Dernière intervention
4 avril 2012
-
cs_chatis
Messages postés
74
Date d'inscription
vendredi 4 juillet 2003
Statut
Membre
Dernière intervention
4 avril 2012
-
Bonjour, je ne suis pas sûr de poster ce message au bon endroit, mais je vais essayer.

Voilà je vous explique ma situation. Je dois développer une application Java qui fournira des webs services à un client PHP. Mon application Java va tourner avec Hibernate. Ma question est simple. Est-il possible que 2 clients différents se connecte sur le même web service mais le web service va aller chercher des infos dans 2 bases de données différentes ? Je vais imager ça pour que vous compreniez mieux :

j'ai 1 web service que j'appelle monWebService et 2 site internet qui sont www.monsite1.com et www.monsite2.com et j'ai également 2 bases de données avec la même structure mais les données différentes en fonction des 2 sites. soit BDD1 qui contient les données du site www.monsite1.com et BDD2 qui contient les données du site www.monsite2.com.

Donc, est-il possible que www.monsite1.com appel monWebService qui ira se connecter sur BDD1 pour lui retourner les données et en même temps www.monsite2.com appel également monWebService qui ira se connecter par contre sur BDD2 pour lui retourner d'autres données ?

Et si celà est possible ? Il y a-t-il quelque chose de spécial à faire ? Où JDBC et Hybernate le font automatiquement. De plus que dois-je fournir à mon IHM pour que mon web service comprenne quelle BDD il doit appeller ?

Merci de votre précieuse aide !!

6 réponses

Messages postés
17
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
6 juin 2011

En utilisant Spring, c'est très simple il faut déclarer plusieurs datasources, et de définir pour chaque JdbcTemplate la datasource qu'il doit utiliser.
Messages postés
74
Date d'inscription
vendredi 4 juillet 2003
Statut
Membre
Dernière intervention
4 avril 2012

Salut,

Merci de ton aide ! Mais plusieurs questions encore...

- je pensais travailler avec Ejb3 (couche Ejb[dao], couche [JPA / Hibernate], couche [JDBC]) c'est pareil aussi ?
- pour déclarer plusieurs datasources, je dois ajouter des ressources dans le fichier xml de configuration ? (exemple ci-dessous)

<resources>
<jdbc-resource enabled="true" jndi-name="jdbc/dbrdvmedecins" object-type="user" poolname="
dbrdvmedecinsPool">
<description/>
</jdbc-resource>
<jdbc-connection-pool ...">



</jdbc-connection-pool>
</resources>

- j'ai vu que JdbcTemplate est sur Spring, connais-tu un tutoriel pour la création d'un web service avec spring ?
- Et comment je fais pour que mon client PHP puisse faire savoir au webservice quelle database il doit utiliser ?

Merci encore de ta précieuse aide
Messages postés
17
Date d'inscription
vendredi 19 mai 2006
Statut
Membre
Dernière intervention
6 juin 2011

Par exemple, sous tomcat tu peux définir plusieurs ressources dans le context.xml.

<?xml version="1.0" encoding="UTF-8"?>
<Context path="myDataSource" reloadable="true" swallowOutput="true">
<Resource auth="Container" description="connDB1"
driverClassName="oracle.jdbc.driver.OracleDriver" initialSize="10"
logAbandoned="true" maxActive="30" maxIdle="6" maxWait="5000"
minEvictableIdleTimeMillis="20000" name=""
numTestsPerEvictionRun="3" removeAbandoned="true" testWhileIdle="true"
timeBetweenEvictionRunsMillis="30000" type="javax.sql.DataSource"
url="jdbc:oracle:thin:@//....." username="..."
password="..." />

<Resource auth="Container" description="connDB2"
driverClassName="oracle.jdbc.driver.OracleDriver" initialSize="10"
logAbandoned="true" maxActive="30" maxIdle="6" maxWait="5000"
minEvictableIdleTimeMillis="20000" name=""
numTestsPerEvictionRun="3" removeAbandoned="true" testWhileIdle="true"
timeBetweenEvictionRunsMillis="30000" type="javax.sql.DataSource"
url="jdbc:oracle:thin:@//....." username="..."
password="..." />
</Context>



Ensuite dans Spring il faut définir tes datasources :
 







<constructor-arg>
<ref bean="dts1" />
</constructor-arg>










<constructor-arg>
<ref bean="dts2" />
</constructor-arg>












Et enfin créer tes couches dao, manager, service, etc ....

Exemple de Dao :
public class MyDao1Impl implements MyDao {
private JdbcTemplate myJdbcTemplate;

public void setMyJdbcTemplate(
final JdbcTemplate myJdbcTemplate) {
this.myJdbcTemplate = myJdbcTemplate;
}

@Override
public List<Object[]> executeQuery(final StringBuilder sql) {

return (List<Object[]>) this.reportJdbcTemplate.query(
sqlStringQuery.toString(), new ResultSetExtractor() {
@Override
public List<Object[]> extractData(final ResultSet rs)
throws SQLException, DataAccessException {

final List<Object[]> res = new ArrayList<Object[]>();
while (rs.next()) {
final int columnCount = rs.getMetaData()
.getColumnCount();

final Object[] objs = new Object[columnCount];

for (int i = 0; i < objs.length; i++) {
objs[i] = rs.getObject(i + 1);
}

res.add(objs);
}
return res;
}
});
}


public MyObject getById(final Long idMyObject){
...........
return res;
}

}
Messages postés
764
Date d'inscription
mardi 25 mai 2004
Statut
Membre
Dernière intervention
8 mars 2011
6
Hello,

dans un serveur d'app il faut laisser la gestion des accès base au serveur.
Il faut donc créer un rar et faire un lookUp dessus.
Avec les ejb3 tu déclarera un persistence.xml et le mapping sera automatiquement fait par ton PersistenceContext (y a plein de tutoriaux la dessus)

Pour revenir à ton problème d'un webservice et deux sites donc deux bases, il faudra bien via un moyen ou un autre tu puisse différencier l'appelant.
Soit en faisant 2 fonctions : le site 1 appelle le fct1 et le site 2 appelle la fct 2 du webservice. Chacune de ces méthode appelle une méthode commune en prenant en argument le nom du datasource à choper.

Sinon tu peux filtrer sur les ips appelantes ou autres (+ ou - facile en fonction de la techno utilisée pour le webservice : axis, spring-ws, CXF etc...)

++ toinou
Messages postés
74
Date d'inscription
vendredi 4 juillet 2003
Statut
Membre
Dernière intervention
4 avril 2012

Merci smarticu ! Mais je veux être sur d'avoir bien compris, dans mon code java la valeur de myJdbcTemplate sera "Dao1" ou "Dao2" ?


Merci également super_toinou je vais aller voir ca... Pour différencier l'appellant, je pensais rajouter un webservice qui permettrait de définir une variable java qui contiendrait le nom de la BDD a utilisé pour ce client à chaque connection. Mais je ne sais pas s'il est possible de conserver ce nom pour qu'il sache que ce client a demandé cette base, et l'autre client en même temps ai demandé une autre base.. ou je suis obligé dans chaque webservice que j'utilise de définir la base de données à utiliser grace a un paramètre envoyé par le client...

car la je parles de 2 BDD, mais ca pourrait s'étendre jusqu'à 50 clients et BDD... voir plus ! Est-ce que le webservice va tenir le coup? Ou il faut vraiment créer un webservice par client ?
Messages postés
74
Date d'inscription
vendredi 4 juillet 2003
Statut
Membre
Dernière intervention
4 avril 2012

1 année après je reviens sur le sujet,

Car je n'utilise pas Spring dans mon appli final. La structure est la suivante : REST - Manager - DAO - Entity sur du java EE 6 JPA/JTA Hibernate. Donc pas de lookup, pas de spring pas de JSF. J'ai bien un persistence.xml ou je défini mes persistence-unit comme suis :

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

  
    org.hibernate.ejb.HibernatePersistence


    <jta-data-source>jdbc/sportreserv</jta-data-source>
    


  






Que j'appelle dans ma couche DAO comme suis :

@PersistenceContext(unitName = "SportReserv-PU")
    private EntityManager em;


Je sais que dans mon persistence.xml je peux définir plusieurs persistence-unit ca c'est pas un problème. Par contre je ne sais pas comment définir mon unitName en fonction du domaine qui a appellé mon application ? Quelqu'un à une idée ? j'ai pensé en passant par des constantes... mais je ne vois pas comment ca peut marcher sur plusieurs session.... any idea ?

Merci