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

Langage Java Discussion :

L'application se plante au niveau de la déclaration du bloc Synchronized


Sujet :

Langage Java

  1. #21
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 740
    Points
    3 740
    Billets dans le blog
    12
    Par défaut
    Quand il parlait du niveau serializable, je pense qu'il faisait référence aux "niveaux d'isolation" des transaction des SGBD, comme celui d'Oracle par exemple.
    Oracle en propose 3 : Read committed (par défaut, pour qu'une autre session n'ait accès que ce qui a été commité), serializable, read-only*.
    Je pense que tu devrais le laisser à son mode par défaut. N'hésite pas à lire la doc pour comprendre les différences, tu peux aussi lire celle de PostgreSQL pour la compréhension.

    * : le standard SQL propose 4 niveaux d'isolation mais ce n'est pas le terme "read-only" qui est employé pour l'un des 3 existants dans Oracle il me semble.

    EDIT : Zut il m'a devancé
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  2. #22
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    Salut tchize_,

    La méthode d'ouverture de connexion utilisée est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public final Connection ouvrirConnexion() throws SQLException, NamingException
        {
            DataSource datasource = getDataSource(Constante.dataSource);
            
            Connection connexion = datasource.getConnection();
            connexion.setAutoCommit(false);
            logger.info("Ouverture connexion : user : " + connexion);
            return connexion;
        }
    Suite à ta remarque sur l'interface Connection, j'ai regardé la doc et j'ai trouvé qu'il existe une méthode Connection: setTransactionIsolation(int level) qui permet de spécifier le mode d'isolation de transactions.

    Du coup, ma question est : est ce qu'il faut modifier le code comme suit pour garantir la bonne gestion de transactions concurrentes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public final Connection ouvrirConnexion() throws SQLException, NamingException
        {
            DataSource datasource = getDataSource(Constante.dataSource);
            
            Connection connexion = datasource.getConnection();
            connexion.setAutoCommit(false);
            connexion.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
            logger.info("Ouverture connexion : user : " + connexion);
            return connexion;
        }

  3. #23
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    Gugelhupf, Je pense que tu devrais le laisser à son mode par défaut
    C'est quoi le mode par défaut ? Est-il toujours le même ? Pourquoi a ton avis il faut garder ce mode ?


    en regardant la doc : http://www.java2s.com/Code/JavaAPI/j...onintlevel.htm, je remarque qu'on fait ce qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connexion.setTransactionIsolation(connexion.getMetaData().getDefaultTransactionIsolation());
    Je ne vois vraiment pas l'utilité de cette instruction

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par JQueen Voir le message
    Du coup, ma question est : est ce qu'il faut modifier le code comme suit pour garantir la bonne gestion de transactions concurrentes ?
    Ca dépend de tes besoins d'isolation, de ce que tu veux garantir dans ta db. Vu que tu utilise une datasource, pas besoin de code, en général il y a une option de configuration directement dans la définition de la datasource.


    Citation Envoyé par JQueen Voir le message
    C'est quoi le mode par défaut ? Est-il toujours le même ? Pourquoi a ton avis il faut garder ce mode ?
    Le mode par défaut dépends du SGBD.
    Citation Envoyé par JQueen Voir le message


    Je ne vois vraiment pas l'utilité de cette instruction
    Revenir à la valeur par défaut. Ca a peu d'intérêt pour un usage courant, le datasource est supposé faire ce boulot.

  5. #25
    Membre habitué Avatar de JQueen
    Inscrit en
    Octobre 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2008
    Messages : 214
    Points : 126
    Points
    126
    Par défaut
    Bonjour,

    Vu que tu utilise une datasource, pas besoin de code, en général il y a une option de configuration directement dans la définition de la datasource.
    Voilà comment je défini ma datasource dans mon fichier context.xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
       <Resource name="jdbc/dataSource" auth="Container" type="javax.sql.DataSource"
                   maxActive="100" maxIdle="30" maxWait="10000"
                   username="user" password="pwd" driverClassName="oracle.jdbc.driver.OracleDriver"
                   url="jdbc:oracle:thin:@xxx.xx.xx.xx:xxx"/>
    C'est à ce moment là que je configure le mode d'isolation de transaction ? comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <Resource name="jdbc/dataSource" auth="Container" type="javax.sql.DataSource"
                   maxActive="100" maxIdle="30" maxWait="10000"
                   username="user" password="pwd" driverClassName="oracle.jdbc.driver.OracleDriver"
                   transaction-isolation="TRANSACTION_SERIALIZABLE"
                   url="jdbc:oracle:thin:@xxx.xx.xx.xx:xxx"/>

  6. #26
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 740
    Points
    3 740
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par JQueen Voir le message
    C'est quoi le mode par défaut ? Est-il toujours le même ? Pourquoi a ton avis il faut garder ce mode ?
    C'est l'un des 4 modes proposés par ton SGBD (ton SGBD peut en proposer moins). Celui d'Oracle (que tu sembles utiliser), ainsi que PostgreSQL, SQL Server et DB2 est Read Committed par défaut, celui de MySQL est Repeateable Read. Je garderais le mode par défaut pour une question de performance par rapport à mon besoin, donc soit je suis dans un environnement multi-utilisateur et ces utilisateurs ne modifient pas et ne font pas de lectures multiples sur un bloc de tuples durant leur transaction, soit je ne suis pas sur ce type d'environnement (ex: je fais la lecture de stats dans ma base que je considère comme un datawarehouse et il n'y a qu'un batch qui écrit de nuit).

    L'inconvénient du mode Read Committed est que si tu as une première transaction qui modifie la table et une autre transaction qui lit plusieurs fois cette même table durant sa transaction (par exemple une première lecture avant et une seconde lecture après que l'autre transaction ait committé), tu peux te retrouver avec une incohérence (lectures des "mêmes" données qui ont étés modifiés). C'est donc à toi d'évaluer si cas arrive dans ton application. En ce qui me concerne 1 besoin = 1 requête SELECT, donc je ne pas censé rencontrer ce type de problème.

    Si tu utilises <Resource> c'est que tu travailles dans un environnement où tu peux faire de l'injection de dépendance avec @Resource, autant en profiter
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

Discussions similaires

  1. [WD15] Application qui plante uniquement sur un poste
    Par mik3.42 dans le forum WinDev
    Réponses: 3
    Dernier message: 09/04/2010, 10h38
  2. Thread et application qui plante
    Par Balbuzard dans le forum Général Java
    Réponses: 10
    Dernier message: 29/08/2008, 17h36
  3. Réponses: 4
    Dernier message: 13/07/2008, 20h55
  4. Application qui plante à cause des tabs ?
    Par astrolus dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/05/2008, 23h54
  5. Application qui plante quand lancé par sans débugage
    Par bossun dans le forum Général Dotnet
    Réponses: 9
    Dernier message: 12/07/2007, 13h08

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