2011-01-10 18 views
20

Tengo una aplicación que usa Spring con Hibernate en una base de datos MySQL. Por alguna razón, a partir de los últimos días, en cualquier momento trato de persistir los objetos a mi base de datos que estoy recibiendo el siguiente error:¿Por qué esta conexión Hibernate MySQL es de solo lectura?

java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed.*

yo no puedo por la vida de a averiguar qué está sucediendo esto . Mi aplicación estaba funcionando bien hace unos días.

Estoy configurando un objeto SessionFactory en mi archivo applicationContext.xml así:

 <bean id="sessionFactory" lass="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="configLocation" 
value="classpath:/hibernate.cfg.xml"/> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.domain.domainObjects</value> 
      </list> 
     </property> 
    </bean> 

mi archivo hibernate.cfg.xml se ve así:

<?xml version='1.0' encoding='utf-8'?> 

<!DOCTYPE hibernate-configuration PUBLIC 
     "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
     "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <!-- Database connection settings --> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="connection.url">jdbc:mysql://{url to db}:3306/{db name}</property> 
     <property name="connection.username">{db user}</property> 
     <property name="connection.password">{db password}</property> 
     <!-- JDBC connection pool (use the built-in) --> 
     <property name="connection.pool_size">10</property> 
     <!-- SQL dialect --> 
     <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 
     <!-- Enable Hibernate's automatic session context management > 
     <property name="current_session_context_class">thread</property--> 
     <!-- Disable the second-level cache --> 
     <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
     <!-- Echo all executed SQL to stdout --> 
     <property name="show_sql">true</property> 
     <!-- Drop and re-create the database schema on startup --> 
     <property name="hbm2ddl.auto">update</property> 

    </session-factory> 
</hibernate-configuration> 

estoy usando un MySQL/j conenction versión 5.1, hibernate versión 3.2, spring mvc 3.0.5

+0

La configuración se ve bien. Por favor, agregue también un código de muestra que se vea afectado por esto. Además, sería bueno si pudiera especificar la versión exacta del controlador MySQL. – jpkrohling

+0

¿Está utilizando la anotación transaccional? Está configurado en @Transactional (readOnly = true) –

+5

Después de aproximadamente 3 horas de depuración horrible ahora sé lo que está pasando. Tengo un método de nivel de servicio en el que también tengo un consejo de "alrededor". El método de nivel de servicio está anotado con @Transactional (readOnly = true), sin embargo, tengo otro servicio que fue anotado con @Transactional (readOnly = false). Mi aspecto (o consejo) es utilizar los mismos objetos DAO que mi capa de servicio normal, por lo que cuando llamé a sessionFactory.getCurrenctSession() me devolvió la sesión que se creó para mi método de nivel de servicio de solo lectura. Ahora, tengo que volver a diseñar. ¡Gracias por tus respuestas! –

Respuesta

36

Después de unas 3 horas de depuración horribles que ahora saben lo que está pasando. Tengo un método de nivel de servicio en el que también tengo un consejo de "alrededor". El método de nivel de servicio está anotado con @Transactional(readOnly=true), sin embargo, tengo otro servicio en mi consejo que fue annotated with @Transactional(readOnly=false).

Mi aspecto (o consejo) es utilizar los mismos objetos DAO que mi capa de servicio normal, por lo que cuando llamé al sessionFactory.getCurrenctSession() me devuelve la sesión que se creó para mi método de nivel de servicio de solo lectura. Ahora, tengo que volver a diseñar.

+2

Nos encontramos con este mismo escenario exacto. Teníamos un método readOnly = true, M1, que envolvía una llamada a otro método M2, que era readOnly = false. Curiosamente, solo estamos viendo esto algunas veces, que no puedo descifrar. – Bradley

Cuestiones relacionadas