2016-11-03 1 views
1

Le serveur reçoit la requête http dans le servlet, à partir de la méthode des appels de servlet du composant ejb.Délai d'attente de requête lors de l'appel de différents threads

public void ejbMethodVariant1(...) { 
    //calling stored proc 
    ... 
    //calling same stored proc 
} 

public void ejbMethodVariant2(...) { 
    //calling stored proc 
    ... 
    Thread t = new Thread(() -> { 
      //calling same stored proc 
     }); 
    t.start(); 
    try { 
     t.join(); 
    } catch (InterruptedException e){ 
     ... 
    } 
} 

La procédure stockée est toujours la même. "Appel proc stocké" signifie:

  1. connexion Obtenir de la source de données
  2. Création déclaration appelable
  3. exécution de l'instruction appelable
  4. Déclaration de clôture
  5. connexion de clôture

Dans la variante 1 - Tout fonctionne parfaitement, sans erreurs. Les connexions dans les premier et deuxième appels ont autoCommit = false.

Dans la variante 2, le premier appel se termine avec succès, après deux minutes (com.microsoft.sqlserver.jdbc.SQLServerException: la requête a expiré.). La connexion au premier appel a autoCommit = false, dans le second appel, autoCommit = true.

+1

Une remarque, selon JEE spec, la création et la gestion de threads n'est pas autorisée dans ejb. Voir [cette réponse] (http://stackoverflow.com/questions/3816286/multithreading-in-a-stateless-session-bean#3816621) ou [this] (http://www.oracle.com/technetwork/java /restrictions-142267.html#threads) –

Répondre

2

Vous démarrez un nouveau thread qui n'a pas le contexte de la transaction, le contexte de sécurité, etc copié. Si vous souhaitez utiliser un nouveau thread pour exécuter l'instruction, utilisez les utilitaires EE Concurrency dans Java EE 7.