2009-07-20 12 views
9

Tôi có một máy chạy một ứng dụng java nói chuyện với một cá thể mysql chạy trên cùng một cá thể. ứng dụng sử dụng trình điều khiển jdbc4 từ mysql. Tôi tiếp tục nhận được com.mysql.jdbc.exceptions.jdbc4.CommunicationsException vào các thời điểm ngẫu nhiên.jdbc4 CommunicationsException

Đây là toàn bộ thư.

Không thể mở kết nối JDBC để giao dịch; lồng nhau ngoại lệ là

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was25899 milliseconds ago.The last packet sent successfully to the server was 25899 milliseconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 

Đối với mysql, giá trị của toàn cầu 'wait_timeout' và 'interactive_timeout' được đặt thành 3600 giây và 'connect_timeout' được đặt thành 60 giây. giá trị thời gian chờ chờ cao hơn nhiều so với 26 giây (25899 ms giây). được đề cập trong dấu vết ngoại lệ.

Tôi sử dụng dbcp để kết nối tổng hợp và đây là cấu hình bean mùa xuân cho nguồn dữ liệu.

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource" > 
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
        <property name="url" value="jdbc:mysql://localhost:3306/db"/> 
       <property name="username" value="xxx"/> 
       <property name="password" value="xxx" /> 
        <property name="poolPreparedStatements" value="false" /> 
      <property name="maxActive" value="3" /> 
      <property name="maxIdle" value="3" /> 
    </bean> 

Bất kỳ ý tưởng nào tại sao điều này có thể xảy ra? Sẽ sử dụng c3p0 giải quyết vấn đề?

Trả lời

6

Thử thiết lập chính xác Apache Commons DBCP.

Bạn cần phải thiết lập:

  • validationQuery để SELECT 1 + 1
  • testOnBorrow true

Điều đó sẽ khắc phục vấn đề.

+0

Thnx, điều này dường như đang hoạt động tại thời điểm này. – letronje

0

Tôi sẽ làm theo lời khuyên trong trường hợp ngoại lệ. Bạn nên cân nhắc một trong hai:

  1. hết hạn và/hoặc kiểm tra tính hợp lệ kết nối trước khi sử dụng trong các ứng dụng của bạn,
  2. tăng giá trị máy chủ cấu hình cho timeouts khách hàng, hoặc
  3. sử dụng Connector/J sở hữu kết nối 'autoReconnect = đúng 'để tránh vấn đề này. Hãy thử thêm điều đó vào URL kết nối của bạn (tham khảo tài liệu để biết cú pháp chính xác) và xem liệu nó có giúp ích hay không.

Tôi nghi ngờ rằng C3P0 sẽ tốt hơn nhiều so với DBCP mà bạn đang sử dụng. Ngoại lệ cho bạn một số lời khuyên cụ thể. Bạn đã thử # 3. Còn hai người còn lại thì sao?

Tôi biết cách yêu cầu WebLogic kiểm tra kết nối trước khi sử dụng chúng. Bạn nên tìm hiểu cách làm tương tự với Tomcat.

+0

đã dùng thử, bây giờ nhận được "Không thể mở kết nối JDBC cho giao dịch; ngoại lệ lồng nhau là com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Lỗi liên kết truyền thông " – letronje

1

Bạn có thể mô tả cách ứng dụng của bạn đang xử lý tổng hợp kết nối không? Tôi nghi ngờ rằng autoReconnect = true trong trình điều khiển JDBC sẽ tái kết nối các kết nối từ ứng dụng của bạn. Ứng dụng cần kết nối lại khi nó mất kết nối.

0

Tôi đã thấy trước đó các máy Windows đã được di chuyển trên mạng đã gặp sự cố khi kết nối với chính chúng.

Có sự cố kết nối nào bên ngoài JVM - tức là máy khách mysql kết nối với máy chủ và thời gian chờ, v.v ... không?

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