Почему это Hibernate MySQL Connection доступно только для чтения? - PullRequest
22 голосов
/ 10 января 2011

У меня есть приложение, использующее Spring с Hibernate в базе данных MySQL.По некоторым причинам, в последние несколько дней, каждый раз, когда я пытаюсь сохранить какие-либо объекты в своей базе данных, я получаю следующую ошибку:

java.sql.SQLException: Соединение только для чтения.Запросы, ведущие к изменению данных, не допускаются. *

Я не могу понять, почему это происходит.Мое приложение работало отлично несколько дней назад.

Я настраиваю объект SessionFactory в моем файле applicationContext.xml следующим образом:

     <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>

мой файл hibernate.cfg.xml выглядит следующим образом:

<?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>

Я использую mysql / j conenction version 5.1, Hibernate версии 3.2, Spring MVC 3.0.5

Ответы [ 2 ]

43 голосов
/ 09 апреля 2012

После 3 часов ужасной отладки я теперь знаю, что происходит. У меня есть метод уровня обслуживания, о котором я также советую. Метод уровня обслуживания помечен @Transactional(readOnly=true), однако в моем совете есть еще одна служба, которая была annotated with @Transactional(readOnly=false).

Мой аспект (или совет) заключается в использовании тех же объектов DAO, что и в моем обычном слое обслуживания, поэтому при вызове sessionFactory.getCurrenctSession() он возвращает мне сеанс, который был создан для моего метода уровня обслуживания только для чтения. Теперь я должен перестроить.

0 голосов
/ 06 марта 2012

Это похоже на ошибку, которую они имеют в MySQL Connector / J для версий до 5.1.6: http://bugs.mysql.com/bug.php?id=38747

Убедитесь, что у вас версия не ниже 5.1.7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...