2009-10-02 22 views
14

tôi đã nhận lỗi này từ mã sản xuất:sinh sản com.mysql.jdbc.exceptions.jdbc4.CommunicationsException với một thiết lập của mùa xuân, hibernate và C3P0

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Gói tin cuối cùng đã nhận được từ máy chủ là36940 giây trước. Gói cuối cùng được gửi thành công đến máy chủ là 36940 giây trước, dài hơn máy chủ giá trị được định cấu hình là 'wait_timeout'. Bạn nên cân nhắc hoặc hết hạn và/hoặc kết nối thử nghiệm hiệu lực trước khi sử dụng trong ứng dụng của bạn, tăng máy chủ cấu hình giá trị cho timeouts khách hàng, hoặc sử dụng Connector/J sở hữu kết nối 'autoReconnect = true' để tránh này vấn đề.

Và bây giờ tôi đang cố gắng tái tạo sự cố cục bộ và khắc phục sự cố đó. Tôi thiết lập bối cảnh mùa xuân như sau:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" 
    destroy-method="close" p:driverClass="com.mysql.jdbc.Driver" 
    p:jdbcUrl="jdbc:mysql://localhost:3306/test?userUnicode=yes&amp;characterEncoding=UTF-8&amp" 
    p:idleConnectionTestPeriod="120" p:initialPoolSize="1" p:maxIdleTime="1800" 
    p:maxPoolSize="1" p:minPoolSize="1" p:checkoutTimeout="1000" 

/> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="hibernateProperties"> 
     <value> 
      hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider 
      hibernate.dialect=org.hibernate.dialect.MySQL5Dialect 
      hibernate.default_schema=platform_server_original 
      hibernate.show_sql=false 
     </value> 
    </property> 
    <property name="mappingResources"> 
     <list> 
      <value>sometables.hbm.xml</value> 
     </list> 
    </property> 
</bean> 

Sau đó tôi đặt wait_timeout mysql của tôi đến 10 giây, sau đó chạy thử nghiệm của tôi, mà về cơ bản là mở một kết nối, làm một truy vấn, đóng nó, vì vậy nó trở lại hồ bơi , sau đó ngủ thread trong 15 giây, và sau đó mở lại kết nối, và thực hiện truy vấn một lần nữa, vì vậy nó sẽ phá vỡ. Tuy nhiên, tôi nhận được một lỗi tương tự chỉ:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Truyền thông liên kết thất bại

gói cuối gửi đến máy chủ là 16 ms trước.

Vì vậy, tôi tự hỏi hai lỗi này giống nhau hay chúng khác nhau? Tôi đã làm một số nghiên cứu, và có vẻ như cả hai lỗi đều đi xuống cùng một giải pháp: sử dụng thuộc tính "testConnectionOnCheckout = true". Tuy nhiên, theo tài liệu c3p0, đây là một chi phiếu rất tốn kém. Nó khuyên bạn nên sử dụng "idleConnectionTestPeriod", nhưng tôi đã thiết lập nó đến 120 giây. Tôi nên sử dụng giá trị nào để có thể xác minh đúng kết nối không hoạt động?

Vì vậy, về cơ bản, tôi hỏi hai điều: 1. làm cách nào để tạo lại lỗi tôi nhận được trong mã sản xuất? 2. làm cách nào để khắc phục sự cố?

Cảm ơn!

+0

lỗi ban đầu của bạn từ khâu sản xuất đang nói về một khoảng thời gian hơn 10 giờ và đang xảy ra khi một kết nối được check-out khi hệ thống đầu tiên được sử dụng vào buổi sáng? Bạn không thể chỉ đặt kích thước hồ bơi tối thiểu thành 0 hoặc phơi bày hồ bơi qua JXB và xả nó trước khi bắt đầu ngày làm việc? – SteveD

+0

@fei - bạn đã giải quyết vấn đề này chưa? Hãy quan tâm để biết kết quả là gì. –

+1

Tôi đã sử dụng 2 thuộc tính sau: testConnectionOnCheckout = "true" preferredTestQuery = "select 1" Không phải giải pháp tối ưu nhất, nhưng nó giải quyết được vấn đề ít nhất. – fei

Trả lời

0

Fei - có thể là một trong nhiều thứ, có thể không thực sự nói dựa trên thông tin được đăng cho đến thời điểm này.

Đề nghị bạn thêm số phiên bản MySQL/Spring/Hibernate/C3PO/JDBC vào câu hỏi của bạn, trong trường hợp có sự cố đã biết.

Thông báo lỗi sản xuất là thông thường, với nhiều nguyên nhân gốc có thể xảy ra. Một số dẫn dành cho bạn:

  1. Các lỗi sản xuất có thể chỉ ra rằng ứng dụng của bạn không phải là phát hành một kết nối trở lại hồ bơi khi thực hiện xong với nó, ngăn chặn C3P0 từ kiểm tra nó.(Các C3P0 kiểm tra nhàn rỗi chỉ có thể được áp dụng cho các kết nối không được kiểm soát -out.)

  2. Kiểm tra xem C3P0 đang thực sự làm việc (bạn có thể sử dụng 'vanilla' kết nối nếu không muốn nói). Trong thử nghiệm của bạn, nếu bạn thiết lập (ví dụ) MySql wait_timeout = 10, chủ đề ứng dụng ngủ = 35, và idleConnectionTestPeriod = 30, nếu tổng hợp đang làm việc, ngoại trừ sẽ biến mất.

  3. Mở các chi phí của kiểm tra nhàn rỗi: xem xét việc không sử dụng mặc định getTables() - có thể thiết lập preferredTestQuery một cái gì đó rẻ (-er) 'SELECT 1' có thể cho MySQL?

0

Để tái tạo lỗi, hãy đặt thời gian chờ kết nối trong thuộc tính MySQL thành giá trị rất thấp, tức là 2 ms và chạy truy vấn được biết là có thời gian xử lý dài. Bạn có thể thiết lập thuộc tính timeout trong chuỗi kết nối MySQL hoặc thông qua một thuộc tính nếu bạn đang sử dụng các tệp thuộc tính để thiết lập kết nối JDBC của bạn. Bạn có thể tra cứu các Javadocs về kết nối jaxax.sql.DataSource cụ thể của bạn và các tài liệu MySQL cho các chi tiết cụ thể về cách thực hiện điều này.

+1

Giá trị chờ đợi của MySQL là giây không phải ms. Vì vậy, nó không thể đặt nó vào 2ms? –

3

Tôi gặp vấn đề tương tự với MySQL và hồ bơi kết nối. Vấn đề là bạn nói với hồ bơi kết nối rằng một thời gian chờ nhàn rỗi là 30 phút, nhưng cơ sở dữ liệu cắt kết nối sau 10 giây. Vì thời gian kiểm tra kết nối không hoạt động của bạn là 120 giây, nó sẽ để lại một chút dưới 110 giây để hồ bơi sử dụng kết nối bị hỏng!

Tôi muốn sử dụng các cài đặt sau cho sản xuất:

MySQL: 
wait_timeout=75 
C3P0: 
maxIdleTime=60 
idleConnectionTestPeriod=55 
Các vấn đề liên quan