2010-01-16 50 views
39

tôi đọc lời khuyên này từ thông báo lỗi:Kết nối với MySql đang bị hủy bỏ tự động. Làm thế nào để cấu hình Connector/J đúng cách?

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 sự Thuộc tính kết nối/kết nối J 'autoReconnect = true' để tránh vấn đề này .

Tôi đang sử dụng Spring và JPA. Tôi nên cấu hình Connector/J ở đâu? (? Trong persistence.xml, hoặc trong entityManagerFactory cấu hình mùa xuân, hoặc trong dateSource cấu hình mùa xuân, hoặc ở một nơi khác)

+0

Xin giúp https://stackoverflow.com/questions/47011116/the-last-packet-sent- thành công-to-the-server-là-70-400-003-milliseconds-ag – Tony

Trả lời

54

Quyển sách mô tả ba giải pháp để ngăn chặn kết nối hủy bỏ:

  1. Cấu hình chuỗi kết nối với autoReconnect=true. Đây là thuộc tính của chuỗi kết nối URL, hoạt động ở cấp trình điều khiển. Bạn cần phải thay đổi chuỗi kết nối trong cấu hình nguồn dữ liệu.

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true" 
    
  2. Tăng thời gian chờ. Đây thường là tài sản của cơ sở dữ liệu. Bạn có thể tăng giá trị này để xem bạn có bị ngắt kết nối ít hơn hay không.

  3. Định cấu hình nhóm kết nối để kiểm tra tính hợp lệ của kết nối. Điều này được thực hiện tại hồ bơi, không phải là cấp độ trình điều khiển. Điều này sẽ phụ thuộc vào việc triển khai nguồn dữ liệu mà bạn sử dụng. Nhưng nó phải được cấu hình trong thuộc tính của nguồn dữ liệu, nếu bạn sử dụng một nguồn dữ liệu gộp, ví dụ: c3p0.

bình luận thêm vào một số:

  • Các nguồn dữ liệu/hồ bơi cũng có thể có một thời gian chờ, tương ứng với thời gian một nhàn rỗi kết nối remai ns trong hồ bơi. Để không nhầm lẫn với thời gian chờ của db.
  • Có một số cách để kiểm tra tính hợp lệ của kết nối. Một cách phổ biến là có bảng thử giả. Các hồ bơi sẽ phát hành một lựa chọn trên bảng thử nghiệm giả để xem kết nối vẫn OK.
+6

Trình điều khiển MySQL không thực hiện đúng tùy chọn autoReconnect. Yêu cầu đầu tiên sẽ không thành công và trình điều khiển cố gắng thiết lập lại kết nối SAU KHÓA. – Riking

+1

Vì câu trả lời này có vẻ là một trong những ưu tiên của công cụ tìm kiếm, nó sẽ là tốt đẹp nếu nó đi kèm với một số giải thích bổ sung, về ý nghĩa của wait_timeout cho MySQL, và làm thế nào nó nên chơi với một cấu hình c3p0. Đối mặt với vấn đề này, tôi có thể thấy thời gian chờ đợi của MySQL là 28800. Nếu đó là 8h thì tôi không cảm thấy muốn nói 72h. Tôi thậm chí không hiểu làm thế nào nó có thể được chấp nhận rằng một kết nối sẽ treo cho đến khi 8h. – Stephane

+5

@StephaneEybert Tôi tìm thấy một lời giải thích thực sự tốt đẹp về vấn đề này ở đây: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html. Điều này có thể giúp ai đó trong tương lai – sunil

14

AutoReconnect không được khuyến nghị. Từ MySQL here

Nếu người lái xe cố gắng thiết lập lại kết nối cũ và/hoặc đã chết? Nếu được bật, trình điều khiển sẽ ném ngoại lệ cho truy vấn được phát hành trên kết nối cũ hoặc cũ, thuộc về giao dịch hiện tại, nhưng sẽ thử kết nối lại trước truy vấn tiếp theo được cấp trên kết nối trong giao dịch mới.Việc sử dụng tính năng này không được đề xuất là vì nó có tác dụng phụ liên quan đến trạng thái phiên và nhất quán dữ liệu khi ứng dụng không xử lý SQLExceptions đúng cách và chỉ được thiết kế để sử dụng khi bạn không thể định cấu hình ứng dụng của mình xử lý SQLExceptions do kết quả chết và cũ. Ngoài ra, tùy chọn cuối cùng, điều tra đặt biến máy chủ MySQL "wait_timeout" thành giá trị cao , thay vì mặc định là 8 giờ.

+4

Vì vậy, những gì sau đó, được khuyến khích thay thế? – jackthehipster

+0

sử dụng c3po với tùy chọn testConnectionOnCheckout = true –

+0

@AndersB Tôi sử dụng c3po, nhưng lỗi vẫn tồn tại https://stackoverflow.com/questions/47011116/the-last-packet-sent-successfully-to-the-server-was-70 -400-003-milliseconds-ag – Tony

-8

Điều này dành cho những người như tôi tìm thấy bài đăng cũ này thông qua công cụ tìm kiếm.

Các câu trả lời khác là tốt hơn dài hạn giải pháp. Nhưng nếu bạn chỉ cần kết nối mysql chạy lại ngay lập tức, bạn có thể shutdown rồi restarttomcat và mọi thứ sẽ hoạt động tốt trong một thời gian. Điều này cho phép bạn tránh thời gian ngừng hoạt động của hệ thống trong khi bạn tìm ra giải pháp dài hạn hơn.

Điều hướng đến $CATALINA_HOME trong terminal, sau đó nhập shutdown.sh, sau đó nhập startup.sh. Đợi một lúc để trình tự khởi động hoàn tất, sau đó ứng dụng của bạn sẽ hoạt động trở lại trong một thời gian.

+0

Câu hỏi không đề cập gì về việc sử dụng Tomcat. – thechrisproject

+0

@thechrisproject Câu hỏi đặt ra là về mùa xuân. Tomcat là container chính được sử dụng để lưu trữ các ứng dụng mùa xuân. Và phương pháp được mô tả trong câu trả lời này giải quyết vấn đề OP. – CodeMed

+0

Tại sao chúng tôi nhắm mục tiêu một số giải pháp không hoạt động trong thời gian dài? Tất cả các máy chủ và kết nối DB cần phải được thiết kế với quan điểm dài hạn trong tâm trí – sunil

0

Tôi đã trải qua nhiều giải pháp và vấn đề của tôi đã được giải quyết nhưng sau một thời gian kết nối hết thời gian chờ hoặc ngắt kết nối. Sau 2 ngày tôi nhận được giải pháp giải quyết được sự cố của mình.

nhiều giải pháp đề nghị sử dụng autoReconnect = true nhưng khi tôi đi qua các tài liệu. Tôi thấy các văn bản sau đây trong nguồn mô tả các tham số autoReconnect:

Việc sử dụng tính năng này không được khuyến khích, bởi vì nó có tác dụng phụ liên quan đến trạng thái phiên và dữ liệu nhất quán

Khi tôi nhìn vào mã Hibernate. Cơ chế kết nối cơ bản của Hibernate không hỗ trợ kết nối lại, người ta phải sử dụng nhóm kết nối H3C0 (bản thân nó không phải lúc nào cũng hỗ trợ kết nối lại). Tuy nhiên, một khi người ta sử dụng H3C0, hành vi mặc định có vẻ như là để xử lý yêu cầu, nếu kết nối chết thì người dùng sẽ thấy và lỗi - nhưng ít nhất nó kết nối lại với yêu cầu tiếp theo. Tôi cho rằng một lỗi là tốt hơn so với các lỗi vô hạn, nhưng vẫn không tốt bằng 0 lỗi. Nó chỉ ra một trong những nhu cầu optiontestConnectionOnCheckout- mà tài liệu không đề nghị bởi vì kiểm tra kết nối trước khi một yêu cầu có thể dẫn đến hiệu suất thấp hơn. Chắc chắn phần mềm trước hết phải làm việc, chỉ thứ hai là nó phải hoạt động nhanh.

Vì vậy, để tóm tắt, để có được một kết nối để “làm việc” (mà tôi xác định là bao gồm cả xử lý giảm các kết nối bằng cách kết nối lại mà không có lỗi): Trong “hibernate.cfg.xml”:

<!-- hibernate.cfg.xml --> 
    <property name="c3p0.min_size">5</property> 
    <property name="c3p0.max_size">20</property> 
    <property name="c3p0.timeout">1800</property> 
    <property name="c3p0.max_statements">50</property> 
    <!-- no "connection.pool_size" entry! --> 

Sau đó tạo một tập tin “c3p0.properties” mà phải nằm trong thư mục gốc của classpath (tức là không có cách nào để ghi đè lên nó cho các bộ phận đặc biệt của ứng dụng):

c3p0.properties

C3P0.testConnectionOnCheckout = true

Nếu giải pháp này không có tác dụng hơn có nhiều giải pháp khả thi: -

1. Add 

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 

Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml: 

<property name="hibernate.c3p0.validate">true</property> 

    Also checkout the last post on this page: 

    https://forum.hibernate.org/viewtopic.php?p=2399313 

    If all these not work than go [more][1] and read in detail 


    [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html 
Các vấn đề liên quan