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

Spring Java Discussion :

Connection is read only


Sujet :

Spring Java

  1. #1
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut Connection is read only
    Salut à tous !

    Dans mon appli, je me prend une exception du style

    Job DEFAULT.scanJob threw a JobExecutionException:
    [exec] org.quartz.JobExecutionException: Could not invoke method 'scanMOPDepository' on target object [fr.a.e.ds.service.system.SystemServiceImpl@c8fa1e] [See nested exception: org.springframework.jdbc.UncategorizedSQLException: (HibernateTemplate): encountered SQLException [Connection is read-only. Queries leading to data modification are not allowed]; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed]
    [exec] at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:174)
    [exec] at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:66)
    [exec] at org.quartz.core.JobRunShell.run(JobRunShell.java:191)
    [exec] at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:516)
    [exec] * Nested Exception (Underlying Cause) ---------------
    [exec] org.springframework.jdbc.UncategorizedSQLException: (HibernateTemplate): encountered SQLException [Connection is read-only. Queries leading to data modification are not allowed]; nested exception is java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
    [exec] java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed
    [exec] at com.mysql.jdbc.ServerPreparedStatement.executeBatch(ServerPreparedStatement.java:537)
    [exec] at org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:701)
    [exec] at net.sf.hibernate.impl.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:54)
    [exec] at net.sf.hibernate.impl.BatcherImpl.executeBatch(BatcherImpl.java:126)
    [exec] at net.sf.hibernate.impl.SessionImpl.executeAll(SessionImpl.java:2421)
    [exec] at net.sf.hibernate.impl.SessionImpl.execute(SessionImpl.java:2372)
    [exec] at net.sf.hibernate.impl.SessionImpl.flush(SessionImpl.java:2240)
    [exec] at net.sf.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:61)
    [exec] at org.springframework.orm.hibernate.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:464)
    [exec] at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:376)
    [exec] at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(TransactionAspectSupport.java:242)
    [exec] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:66)
    Bon, très bien. Cependant elle se produit sur un appel comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _myBean.getSomeAttributes(some parameters)
    Avec dans appCxt.xml, pour myBean :


    <bean id="transactionManager"
    class="org.springframework.orm.hibernate.HibernateTransactionManager">
    <property name="sessionFactory">
    <ref local="sessionFactory" />
    </property>
    </bean>



    <bean id="myBean"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="transactionManager">
    <ref local="transactionManager" />
    </property>
    <property name="preInterceptors">
    <ref bean = "performanceInterceptor"/>
    </property>
    <property name="transactionAttributes">
    <props>
    <!-- General rule for read-only methods -->
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
    - Pourquoi il me dit que j'ai pas le droit de faire des modifs alors que je veux juste faire un get?
    - Peut être il reste des choses non commitées?

    Si vous avez une explication, je suis preneur

  2. #2
    Membre actif Avatar de aymen83
    Inscrit en
    Décembre 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 271
    Points : 268
    Points
    268
    Par défaut
    salut,

    l'exception est déclanchée par un bean quartz. Ce dernier utilise des tables dans la base de donnée pour faire la gestion des jobs et triggers.
    ça constitue peut etre une piste.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 958
    Points : 4 387
    Points
    4 387
    Par défaut
    Citation Envoyé par aymen83 Voir le message
    salut,

    l'exception est déclanchée par un bean quartz. Ce dernier utilise des tables dans la base de donnée pour faire la gestion des jobs et triggers.
    ça constitue peut etre une piste.
    … et si un trigger met à jour directement ou par effet de bord un champ du genre "latest access time"… par exemple…

  4. #4
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Bonjour et merci pour vos réponses.

    Ma méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _myBean.getSomeAttributes(some parameters)
    Fait juste un oneOfMyDAO.getOneOfMyObject()...

    En rajoutant les traces Hibernate dans mon appli, je me rend compte que juste après l'appel de cette méthode, j'ai 2 traces qui passent :

    [exec] 10:53:32,925 INFO (QuartzScheduler_Worker-3) [STDOUT] - Hibernate: select t1 from T_TABLE_1 where blabla

    [exec] 10:53:33,097 INFO (QuartzScheduler_Worker-3) [STDOUT] - Hibernate: update T_TABLE_2 set .... where ...
    Autant le select je comprend bien (je fais un get...), autant l'update j'ai un peu de mal à voir d'ou il vient... :'(

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 958
    Points : 4 387
    Points
    4 387
    Par défaut
    Citation Envoyé par GyZmoO Voir le message
    Bonjour et merci pour vos réponses.

    Ma méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _myBean.getSomeAttributes(some parameters)
    Fait juste un oneOfMyDAO.getOneOfMyObject()...

    En rajoutant les traces Hibernate dans mon appli, je me rend compte que juste après l'appel de cette méthode, j'ai 2 traces qui passent :



    Autant le select je comprend bien (je fais un get...), autant l'update j'ai un peu de mal à voir d'ou il vient... :'(
    ce sont les champs qui apparaissent dans le "update … set …" qui constitueront le principal indice… pour peu qu'ils n'y soient pas tous évidemment…

  6. #6
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    pour peu qu'ils n'y soient pas tous évidemment…
    Et bien sur, c'est tous les champs qui apparaissent dans le UPDATE

    UPDATE T_TABLE_2 SET ALL MY ATTRIBUTES WHERE PRIMAY_KEY = A value

    ... Pas de bol ...

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 958
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 958
    Points : 4 387
    Points
    4 387
    Par défaut
    Citation Envoyé par GyZmoO Voir le message
    Et bien sur, c'est tous les champs qui apparaissent dans le UPDATE

    UPDATE T_TABLE_2 SET ALL MY ATTRIBUTES WHERE PRIMAY_KEY = A value

    ... Pas de bol ...
    l'update est provoqué par un "touch" d'une instance de l'entité persistée dans T_TABLE_2…

    si ce n'est pas par un setter, ou la modification du contenu d'un ensemble OneToMany… cela ne laisse qu'un trigger… ou l'effet de bord d'une annotation…

    … à moins que quelqu'un n'ait une meilleure idée… il va peut-être être nécessaire de faire un peu de cave-man debugging… (== du trace log de ce qui se passe…)…

  8. #8
    Membre averti Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2006
    Messages : 428
    Points : 301
    Points
    301
    Par défaut
    Voici le mapping concernant table_1 vers table_2 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            <many-to-one
                name="currentCondition"
                class="domain.mon.Condition"
                cascade="none"
                outer-join="auto"
                update="true"
                insert="true"
                access="property"
                column="par_chkcond_id"
                unique="true"
            />
    et table_2 vers table_1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
            <many-to-one
                name="Parameter"
                class="domain.mon.Parameter"
                cascade="none"
                outer-join="auto"
                update="true"
                insert="true"
                access="property"
                column="par_id"
                not-null="true"
            />

Discussions similaires

  1. Connection string READ ONLY
    Par Mustang83 dans le forum ADO.NET
    Réponses: 3
    Dernier message: 19/10/2013, 12h58
  2. Ouvrir un document Excel en READ ONLY (avec VBA)
    Par beegees dans le forum Access
    Réponses: 2
    Dernier message: 29/12/2004, 20h48
  3. Rendre ma BD standby disponible en read only?
    Par learn dans le forum Administration
    Réponses: 2
    Dernier message: 30/03/2004, 11h31
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 15h00

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