Sự cố của bạn là jTDS không hỗ trợ cách DBCP2 xác thực kết nối theo mặc định (Tôi giả sử bạn sử dụng DBCP2 từ <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Xem giải pháp bên dưới.
Thông thường lỗi stacktrace như được hiển thị:
Caused by: java.lang.AbstractMethodError
at net.sourceforge.jtds.jdbc.JtdsConnection.isValid(JtdsConnection.java:2833)
at org.apache.tomcat.dbcp.dbcp2.DelegatingConnection.isValid(DelegatingConnection.java:913)
Tuy nhiên, sự cố không liên quan đến phiên bản SQL Server mà là phiên bản DBCP (Tomcat) được sử dụng (hoặc phiên bản máy chủ Tomcat mà dự án được triển khai).
Khi tôi đang sử dụng jTDS 1.3.1 và dự án hoạt động tốt (và cũng được kết nối với SQLServer 2012) trong Tomcat7. Khi tôi đổi sang Tomcat 8, lỗi đó đã xuất hiện.
Lý do, như gợi ý trong diễn đàn jTDS , là:
- ( Tomcat7 sử dụng DBCP 1 và Tomcat 8 sử dụng DBCP 2 )
- Không giống như DBCP 1.x , DBCP 2 sẽ gọi
java.sql.Connection.isValid(int)
để xác thực kết nối - jTDS không triển khai
.isValid()
, vì vậy trình điều khiển jTDS sẽ không hoạt động với DBCP 2, trừ khi ... - ... trừ khi bạn đặt
validationQuery
tham số này sẽ làm cho DBCP không gọi.isValid()
để kiểm tra tính hợp lệ của kết nối.
Giải pháp thay thế
Vì vậy, cách giải quyết là đặt validationQuery
tham số , điều này sẽ làm cho DBCP2 không gọi .isValid()
để kiểm tra tính hợp lệ của kết nối. Đây là cách thực hiện:
Trên Tomcat
Thêm validationQuery="select 1"
tới Tomcat <Resource>
của bạn cho nhóm kết nối, thường nằm trong META-INF/context.xml
ứng dụng của bạn hoặc conf/server.xml
:
<Resource ... validationQuery="select 1" />
Vào mùa xuân
Khi sử dụng DBCP2 thông qua Spring, giải pháp là:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
Trên mã java đơn giản
dataSource.setValidationQuery("select 1");