Câu hỏi hay. Tôi từng đấu tranh với câu hỏi này. Câu trả lời phổ biến nhất trên stackoverflow là "Nó phụ thuộc ...." cho hầu hết mọi vấn đề. Tôi ghét phải nói điều đó nhưng không có nơi nào phù hợp hơn việc điều chỉnh nhóm kết nối của bạn. Nó thực sự là một trò chơi của cung và cầu, trong đó các yêu cầu kết nối của bạn là nhu cầu và nguồn cung là số lượng kết nối mà MySQL có sẵn. Nó thực sự phụ thuộc vào việc liệu mối quan tâm chính của bạn là ngăn chặn các kết nối cũ được trả lại từ nhóm hay liệu mối quan tâm của bạn là đảm bảo MySQL không bị quá tải với các kết nối nhàn rỗi vì bạn không giết chúng đủ nhanh. Hầu hết mọi người kiềm ở giữa một số nơi.
Nếu bạn thực sự hiểu tại sao ai đó lại chọn bất kỳ cấu hình nhóm kết nối nào thì hãy tin tôi rằng bạn sẽ ngừng tìm kiếm cài đặt "Rocket Solid" bởi vì bạn sẽ biết điều đó giống như googling cho một kế hoạch kinh doanh cho cửa hàng của bạn; Nó hoàn toàn bắt nguồn từ việc bạn nhận được bao nhiêu yêu cầu kết nối và bao nhiêu kết nối liên tục mà bạn sẵn sàng cung cấp. Dưới đây, tôi đưa ra các ví dụ về lý do tại sao bạn sẽ sử dụng các cài đặt nhất định. Tôi tham chiếu các biến mà bạn sẽ phải thay đổi bên trong thẻ "Tài nguyên" của thẻ "Ngữ cảnh" của tệp Context.xml của bạn. Bạn có thể nhìn thấy cấu hình đầy đủ mẫu ở dưới cùng.
Lưu lượng truy cập thấp
Trong tình huống này, bạn có ít yêu cầu đối với ứng dụng của mình, vì vậy rất có thể TẤT CẢ các kết nối trong nhóm kết nối của bạn sẽ cũ và yêu cầu đầu tiên của ứng dụng của bạn bởi một kết nối cũ sẽ gây ra lỗi. (Tùy thuộc vào trình điều khiển MySQL mà bạn đang sử dụng, lỗi có thể giải thích rằng gói thành công cuối cùng nhận được đã vượt quá cài đặt wait_timeout của cơ sở dữ liệu). Vì vậy, chiến lược nhóm kết nối của bạn là ngăn chặn một kết nối chết được trả lại. Hai tùy chọn sau đây có ít tác dụng phụ đối với một trang web có lưu lượng truy cập thấp.
-
Chờ lâu hơn trước khi hủy kết nối - Bạn sẽ thực hiện việc này bằng cách thay đổi giá trị của
wait_timeout
trong cấu hình MySQL của bạn. Trong bàn làm việc MYSQL, bạn có thể dễ dàng tìm thấy cài đặt đó trong Admnin> Tệp cấu hình> Mạng. Đối với một trang web có nhiều lưu lượng truy cập, điều này thường không được khuyến khích bởi vì nó có thể dẫn đến nhóm luôn chứa đầy các kết nối không hoạt động. Nhưng hãy nhớ rằng đây là mức lưu lượng truy cập thấp. -
Kiểm tra mọi kết nối - Bạn có thể thực hiện việc này bằng cách đặt
testOnBorrow = true
vàvalidationQuery= "SELECT 1"
. Còn về hiệu suất thì sao? Bạn có lưu lượng truy cập thấp trong tình huống này. Kiểm tra mọi kết nối được trả về từ nhóm không phải là một vấn đề. Tất cả điều đó có nghĩa là một truy vấn bổ sung sẽ được thêm vào mọi giao dịch MySQL mà bạn đang thực hiện trên một kết nối duy nhất. Trên một trang web có lưu lượng truy cập thấp, đây có thực sự là điều bạn sẽ lo lắng? Vấn đề kết nối của bạn bị chết trong nhóm vì chúng không được sử dụng là trọng tâm chính của bạn.
Lưu lượng truy cập trung bình
- Kiểm tra Tất cả các Kết nối Định kỳ -Nếu bạn không muốn kiểm tra mọi kết nối mỗi khi nó được sử dụng hoặc kéo dài thời gian chờ, thì bạn có thể kiểm tra định kỳ tất cả các kết nối bằng truy vấn tùy chỉnh mặc định mà bạn chọn. Ví dụ:set
validationQuery= "SELECT 1"
,testWhileIdle = "true"
vàtimeBetweenEvictionRunsMillis = "3600"
hoặc bất kỳ khoảng thời gian nào bạn muốn. Đối với lưu lượng truy cập rất thấp, điều này chắc chắn sẽ đòi hỏi nhiều công việc hơn. Hãy suy nghĩ về nó. Nếu bạn có 30 kết nối trong nhóm và trong 1 giờ chỉ có 4 kết nối được gọi, thì bạn có thể dễ dàng kiểm tra tất cả 4 kết nối theo từng yêu cầu bằng cách sử dụngtestOnBorrow
trước đó cách tiếp cận với hiệu suất thấp. Nhưng nếu thay vào đó bạn thực hiện phương pháp "Kiểm tra tất cả mỗi giờ" thì bạn thực hiện 30 yêu cầu để kiểm tra tất cả các kết nối khi chỉ 4 được sử dụng.
Lưu lượng truy cập cao
- Hủy kết nối không hoạt động Sớm hơn - Đây là tình huống mà mọi người nói rằng bạn không nên kéo dài thời gian chờ đợi và bạn không nên kiểm tra mọi kết nối. Nó không phải là một hình mẫu lý tưởng cho mọi tình huống. Khi bạn có kết nối trafficevery đáng kể trong nhóm sẽ được sử dụng và vấn đề thực tế của bạn sẽ làm tăng số lượng kết nối khả dụng đồng thời rút ngắn thời lượng
wait_time
của bạn một cách chính xác để bạn không kết thúc nhiều kết nối nhàn rỗi trên DB. Đây là ví dụ về một chương nói về việc anh ta có tới 10.000 kết nối không hoạt động mỗi ngày cho một trang web bận rộn, vì vậy anh ta muốn giảm thời gian chờ đợi Giảm thời gian chờ đợi cho trang web bận
Cấu hình Context.xml mẫu
<Context>
<Resource name="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="false"
validationQuery="SELECT 1"
validationInterval="30000"
timeBetweenEvictionRunsMillis="30000"
maxActive="100"
minIdle="10"
maxWait="10000"
initialSize="10"
removeAbandonedTimeout="60"
removeAbandoned="true"
logAbandoned="true"
minEvictableIdleTimeMillis="30000"
jmxEnabled="true"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;
org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
username="root"
password="password"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mysql"/>
</Context>
Cấu hình web.xml mẫu
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
Tài liệu về các thuộc tính của Tomcat Pool để điều chỉnh Tomcat Pool