あなたの問題は、jTDS がデフォルトで DBCP2 が接続を検証する方法をサポートしていないことです (<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource">
)。以下の解決策を参照してください。
通常、エラー スタック トレースは次のようになります:
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)
ただし、問題は SQL Server のバージョンではなく、使用されている DBCP (Tomcat) のバージョン (またはプロジェクトがデプロイされている Tomcat サーバーのバージョン) に関連しています。
jTDS 1.3.1を使用していて、Tomcat7の下でプロジェクトが正常に機能しました(そしてSQLServer 2012にも接続されました)。 Tomcat 8 に変更したら、そのエラーが表示されました。
jTDS フォーラムでほのめかされた 理由 、は:
- (Tomcat7 は DBCP 1 を使用し、Tomcat 8 は DBCP 2 を使用します )
- DBCP 1.x とは異なります 、DBCP 2
java.sql.Connection.isValid(int)
を呼び出します 接続を検証する - jTDS は
.isValid()
を実装していません であるため、jTDS ドライバーは DBCP 2 では動作しません。ただし... - ...
validationQuery
を設定しない限り DBCP が.isValid()
を呼び出さないようにするパラメーター 接続の有効性をテストします。
回避策
したがって、回避策は、validationQuery
を設定することです パラメータ これにより、DBCP2 は .isValid()
を呼び出さなくなります 接続の有効性をテストします。方法は次のとおりです:
Tomcat の場合
validationQuery="select 1"
を追加 Tomcat <Resource>
に 接続プールのタグ。通常は META-INF/context.xml
にあります アプリまたは conf/server.xml
の :
<Resource ... validationQuery="select 1" />
春に
Spring で DBCP2 を使用する場合、解決策は次のとおりです。
<bean id="..." ...>
...
<property name="validationQuery" value="select 1" />
</bean>
簡単な Java コードについて
dataSource.setValidationQuery("select 1");