Tôi đang sử dụng Spring MVC để xây dựng một lớp mỏng trên cơ sở dữ liệu SQL Server. Khi tôi bắt đầu thử nghiệm, có vẻ như nó không xử lý căng thẳng rất tốt :). Tôi đang sử dụng Apache Commons DBCP để xử lý kết nối tổng hợp và nguồn dữ liệu.Cách thích hợp để xử lý các kết nối JDBC với Spring và DBCP là gì?
Khi lần đầu tiên thử ~ 10-15 kết nối đồng thời, nó thường bị treo và tôi phải khởi động lại máy chủ (đối với dev tôi đang sử dụng Tomcat, nhưng cuối cùng tôi sẽ phải triển khai trên Weblogic).
Đây là những định nghĩa bean mùa xuân của tôi:
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="[...]"/>
<property name="username" value="[...]" />
<property name="password" value="[...]" />
</bean>
<bean id="partnerDAO" class="com.hp.gpl.JdbcPartnerDAO">
<constructor-arg ref="dataSource"/>
</bean>
<!-- + other beans -->
Và đây là cách tôi sử dụng chúng:
// in the DAO
public JdbcPartnerDAO(DataSource dataSource) {
jdbcTemplate = new JdbcTemplate(dataSource);
}
// in the controller
@Autowired
private PartnerDAO partnerDAO;
// in the controller method
Collection<Partner> partners = partnerDAO.getPartners(...);
Sau khi đọc xung quanh một chút, tôi thấy maxWait
, maxActive
và maxIdle
thuộc tính cho số BasicDataSource (từ GenericObjectPool). Đây là vấn đề. Tôi không chắc làm thế nào tôi nên đặt chúng, hiệu quả khôn ngoan. Từ những gì tôi biết, mùa xuân nên quản lý các kết nối của tôi vì vậy tôi không cần phải lo lắng về việc phát hành chúng.
<bean id="dataSource" destroy-method="close"
class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver"/>
<property name="url" value="[...]"/>
<property name="username" value="[...]" />
<property name="password" value="[...]" />
<property name="maxWait" value="30" />
<property name="maxIdle" value="-1" />
<property name="maxActive" value="-1" />
</bean>
Trước tiên, tôi đặt maxWait
, để nó không treo và thay vào đó ném ngoại lệ khi không có kết nối nào từ hồ bơi. Thông báo ngoại lệ là:
Không thể nhận được kết nối JDBC; lồng nhau ngoại lệ là org.apache.commons.dbcp.SQLNestedException: Không thể có được một kết nối, lỗi hồ bơi Timeout chờ đợi đối tượng nhàn rỗi
Có một số truy vấn dài chạy, nhưng các ngoại lệ được ném không phụ thuộc vào độ phức tạp truy vấn.
Sau đó, tôi đặt maxActive và maxIdle để nó sẽ không ném ngoại lệ ngay từ đầu. Giá trị mặc định là 8 cho maxActive
và maxIdle
(Tôi không hiểu tại sao); nếu tôi đặt chúng thành -1 thì không có ngoại lệ nào bị ném và mọi thứ có vẻ như để hoạt động tốt.
Xem xét rằng ứng dụng này sẽ hỗ trợ một số lượng lớn các yêu cầu đồng thời là bạn có thể để các cài đặt này thành vô hạn không? Liệu Spring có thực sự quản lý các kết nối của tôi, xem xét các lỗi mà tôi nhận được không? Tôi có nên chuyển sang C3P0 xem xét nó đã chết?
Nếu bạn nhận được bất kỳ ngoại lệ nào, việc đăng chồng ngăn xếp sẽ giúp xác định sự cố dễ dàng, Có bất kỳ truy vấn chạy dài nào mà bạn đang gặp sự cố không? –
Tôi đã cập nhật bài đăng của mình với thông báo ngoại lệ và một số thông tin bổ sung. –