Đầu tiên, hãy hiểu các thuộc tính mysql.
-
interactive_timeout
:thời gian chờ tương tác cho các phiên shell mysql trong vài giây như các công cụ dòng lệnh mysqldump hoặc mysql. kết nối ở trạng thái ngủ. Hầu hết thời gian, giá trị này được đặt thành giá trị cao hơn vì bạn không muốn nó bị ngắt kết nối khi bạn đang làm gì đó trên mysql cli. -
wait_timeout
:số giây trong thời gian không hoạt động mà MySQL sẽ đợi trước đó sẽ đóng một kết nối trên một kết nối không tương tác trong vài giây. ví dụ:kết nối từ java. các kết nối đang ở trạng thái ngủ.
Bây giờ chúng ta hãy hiểu các thuộc tính c3po và mối quan hệ của nó với các đạo cụ DB. (Tôi chỉ xin sao chép từ câu hỏi của bạn)
Điều này đề cập đến thời gian một đối tượng kết nối có thể sử dụng được và sẽ có sẵn trong nhóm. Sau khi hết thời gian chờ c3po sẽ phá hủy nó hoặc tái chế nó.
Bây giờ vấn đề xảy ra khi bạn có maxIdleTime
cao hơn thì wait_timeout
.let nói nếu mxIdleTime : 50
giây và wait_timeout : 40 s
thì có một điều đáng tiếc là bạn sẽ nhận được Connection time out exception: Broken Pipe
nếu bạn cố gắng thực hiện bất kỳ thao tác nào trong 10 giây qua. Vì vậy, maxIdelTime
phải luôn nhỏ hơn wait_timeout
.
Thay vì maxIdleTime, bạn có thể có các thuộc tính sau.
-
idleConnectionTestPeriod
đặt giới hạn thời gian kết nối sẽ ngừng hoạt động trước khi kiểm tra. Không cópreferredTestQuery
, defaultisDatabaseMetaData.getTables()
- là cơ sở dữ liệu bất khả tri, và mặc dù một cuộc gọi tương đối đắt tiền, có lẽ là tốt cho cơ sở dữ liệu tương đối nhỏ. Nếu bạn hoang tưởng về hiệu suất, hãy sử dụng thủy sản cụ thể cho cơ sở dữ liệu của bạn(i.e. preferredTestQuery="SELECT 1")
-
maxIdleTimeExcessConnections
sẽ đưa số tiền từ chối kết nối trở lại minPoolSize sau khi hoạt động tăng đột biến.
Xin lưu ý rằng bất kỳ thuộc tính hồ bơi nào (ví dụ:maxIdleTime
) chỉ ảnh hưởng đến kết nối nằm trong nhóm tức là nếu hibernate đã có được kết nối và giữ nó ở chế độ chờ hơn maxIdleTime và sau đó cố gắng thực hiện bất kỳ thao tác nào thì bạn sẽ nhận được "Broken Pipe"
Sẽ tốt nếu có wait_timeout
thấp hơn trên mysql nhưng không phải lúc nào cũng đúng khi bạn đã xây dựng sẵn một ứng dụng. Bạn phải đảm bảo trước khi giảm bớt nó rằng trong ứng dụng của bạn, bạn không giữ kết nối mở để biết thêm điều đó wait_time
ra ngoài.
Bạn cũng phải cân nhắc rằng việc có được kết nối là một nhiệm vụ tốn kém và nếu thời gian chờ đợi quá thấp thì nó sẽ đánh bại toàn bộ mục đích của việc có nhóm kết nối, vì nó sẽ thường xuyên cố gắng lấy kết nối.
Điều này đặc biệt quan trọng khi bạn không thực hiện quản lý kết nối theo cách thủ công, ví dụ như khi bạn sử dụng Spring xuyên quốc gia API. Spring bắt đầu giao dịch khi bạn nhập @Transaction
phương thức chú thích để nó có được một kết nối từ nhóm. Nếu bạn đang thực hiện bất kỳ cuộc gọi dịch vụ web nào hoặc đọc một số tệp sẽ mất nhiều thời gian hơn thời gian chờ đợi thì bạn sẽ có ngoại lệ.
Tôi đã gặp phải vấn đề này một lần.
Trong một trong những dự án của tôi, tôi có một cron sẽ xử lý đơn hàng cho khách hàng. Để làm cho nó nhanh hơn, tôi đã sử dụng xử lý hàng loạt. Bây giờ khi tôi truy xuất một loạt khách hàng và thực hiện một số xử lý (không có lệnh gọi db). Khi tôi cố gắng lưu tất cả các đơn đặt hàng tôi đã sử dụng để có được ngoại lệ đường ống bị hỏng. Vấn đề là thời gian chờ đợi của tôi là 1 phút và việc xử lý đơn đặt hàng mất nhiều thời gian hơn sau đó. Vì vậy, chúng tôi đã phải tăng nó lên 2 phút. Tôi có thể đã giảm kích thước lô nhưng điều đó đang làm cho quá trình xử lý tổng thể chậm hơn.