Masalah Anda adalah jTDS tidak mendukung cara DBCP2 memvalidasi koneksi secara default (saya berasumsi Anda menggunakan DBCP2 dari <bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
). Lihat solusinya di bawah.
Biasanya stacktrace kesalahan seperti yang ditunjukkan:
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)
Masalahnya, bagaimanapun, tidak terkait dengan versi SQL Server, tetapi dengan versi DBCP (Tomcat) yang digunakan (atau versi server Tomcat yang digunakan proyek).
Setelah saya menggunakan jTDS 1.3.1 dan proyek bekerja dengan baik (dan terhubung ke SQLServer 2012 juga) di bawah Tomcat7. Ketika saya mengubah ke Tomcat 8, kesalahan itu muncul.
Alasannya, seperti diisyaratkan di forum jTDS , adalah:
- (Tomcat7 menggunakan DBCP 1 dan Tomcat 8 menggunakan DBCP 2 )
- Tidak seperti DBCP 1.x , DBCP 2 akan memanggil
java.sql.Connection.isValid(int)
untuk memvalidasi koneksi - jTDS tidak mengimplementasikan
.isValid()
, jadi driver jTDS tidak akan bekerja dengan DBCP 2, kecuali... - ...kecuali jika Anda menyetel
validationQuery
parameter, yang akan membuat DBCP tidak memanggil.isValid()
untuk menguji validitas koneksi.
Solusi
Jadi, solusinya adalah mengatur validationQuery
parameter , yang akan membuat DBCP2 tidak memanggil .isValid()
untuk menguji validitas koneksi. Begini caranya:
Di Tomcat
Tambahkan validationQuery="select 1"
ke <Resource>
Tom Tomcat Anda tag untuk kumpulan koneksi, yang biasanya di META-INF/context.xml
aplikasi Anda atau conf/server.xml
:
<Resource ... validationQuery="select 1" />
Pada Musim Semi
Saat menggunakan DBCP2 melalui Spring, solusinya ada di sekitar:
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
Pada Kode java Sederhana
dataSource.setValidationQuery("select 1");