Bonjour
J’ai une archi :
Frontal Web / tomcat -> WebServices ->EJB3 -> EJB3 -> JDBC sur au choix 200 BDD.
Depuis le frontal, on recup des listes venant d’une des 200 BDD par choix de l’utilisateur
Mon EJB3 en charge de monter la connexion vers l’une des BDD est écrit en gros comme ca :
Je viens de m'apercevoir qu’en faisant un premier appel-1 depuis le Webservice à getListe sur un hotel-1, puis un appel-2 à getliste sur un hotel-2, Si la connexion sur hotel-1ne se monte pas (BDD arrêtée) et bien la connexion sur l’hotel-2 attends le retour de la première connexion.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import java.sql.Connection; @Stateless public class HotelBean implements HotelLocal { private Connection connection; private Statement getStatement(HotelsSystem hotelSystem) throws BusinessException{ Logger.getLogger(HotelBean.class.getName()).finest("connect to :" + hotelSystem.getHotelid()); try { Class.forName("com.informix.jdbc.IfxDriver"); connection = DriverManager.getConnection("jdbc:informix .", "", ""); hotelStatement = connection.createStatement(); } catch (Exception e) { Logger.getLogger(HotelBean.class.getName()).log(Level.SEVERE, null, e); throw new BusinessException(resources.getString("BusinessException.connection.informix.echec")); } return hotelStatement; public ListeObj getListe (HotelSystem hotel){ statement = getStatement(hotel); String requete = "execute procedure .);"; resultSet = statement.executeQuery(requete); } }
Ce qui fait que toutes les autres requêtes sont bloqué tant que la première connexion n’a pas rendu de retour.
Donc si je comprends bien mon WS interroge mon EJB3 qui peut lancer plusieurs traitements à la fois, mais Les différents traitements de mon EJB utilisent le même objet « Statement » ??
Dans mes traces je vois bien les deux appels à getStatement en parallèle, puis blocages des deux et quand le premier retourne une erreur alors le deuxième continu.
Partager