2011-01-10 32 views
20

Tôi có một ứng dụng sử dụng Spring with Hibernate trên cơ sở dữ liệu MySQL. Đối với một số lý do, tính đến vài ngày qua, bất cứ lúc nào tôi cố gắng để tồn tại bất kỳ đối tượng cơ sở dữ liệu của tôi Tôi nhận được lỗi sau:Tại sao kết nối MySQL Hibernate này chỉ đọc?

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

tôi có thể không cho cuộc sống của tôi ra tại sao điều này đang xảy ra . Ứng dụng của tôi đã hoạt động tốt cách đây vài ngày.

Tôi cấu hình một đối tượng SessionFactory trong tập tin applicationContext.xml của tôi như thế này:

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

tập tin hibernate.cfg.xml của tôi trông như thế này:

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

Tôi đang sử dụng mysql/j conenction phiên bản 5.1, phiên bản hibernate 3.2, spring mvc 3.0.5

+0

Cấu hình có vẻ tốt. Xin vui lòng, cũng thêm một mã mẫu bị ảnh hưởng bởi điều này. Ngoài ra, nó sẽ là tốt đẹp nếu bạn có thể chỉ định phiên bản chính xác của trình điều khiển MySQL. – jpkrohling

+0

Bạn có đang sử dụng chú thích Giao dịch không? Nó được đặt thành @Transactional (readOnly = true) –

+5

Sau khoảng 3 giờ gỡ lỗi khủng khiếp, tôi biết điều gì đang diễn ra. Tôi có một phương pháp cấp dịch vụ mà tôi cũng có lời khuyên "xung quanh". Phương thức mức dịch vụ được chú thích bằng @Transactional (readOnly = true), tuy nhiên, tôi có một dịch vụ khác trong lời khuyên của tôi đã được chú thích bằng @Transactional (readOnly = false). Khía cạnh của tôi (hoặc lời khuyên) đang sử dụng các đối tượng DAO giống như lớp dịch vụ thông thường của tôi, vì vậy khi tôi gọi sessionFactory.getCurrenctSession() nó cho tôi trở lại phiên đã được tạo cho phương thức mức dịch vụ chỉ đọc của tôi. Bây giờ, tôi phải tái kiến ​​trúc. Cảm ơn bạn đã trả lời! –

Trả lời

36

Sau khoảng 3 giờ gỡ lỗi khủng khiếp bây giờ tôi biết những gì đang xảy ra. Tôi có một phương pháp cấp dịch vụ mà tôi cũng có lời khuyên "xung quanh". Tuy nhiên, phương thức cấp dịch vụ được chú thích với số @Transactional(readOnly=true), tôi có một dịch vụ khác theo lời khuyên của tôi là annotated with @Transactional(readOnly=false).

khía cạnh của tôi (hoặc lời khuyên) đang sử dụng các đối tượng DAO giống như lớp dịch vụ thông thường của tôi, vì vậy khi tôi gọi là sessionFactory.getCurrenctSession() nó cho tôi trở lại phiên đã được tạo cho phương thức mức dịch vụ chỉ đọc của tôi. Bây giờ, tôi phải tái kiến ​​trúc.

+2

Chúng tôi chạy vào kịch bản chính xác này. Chúng tôi đã có phương thức readOnly = true, M1, gói một cuộc gọi đến phương thức M2 khác, đó là readOnly = false. Thật thú vị, chúng tôi chỉ nhìn thấy một số thời gian mà tôi không thể tìm ra. – Bradley

0

Điều này giống như lỗi mà chúng có trong MySQL Connector/J cho các phiên bản lên đến 5.1.6: http://bugs.mysql.com/bug.php?id=38747

Hãy chắc chắn rằng phiên bản là trường hợp của bạn ít nhất là 5.1.7

Các vấn đề liên quan