SQL Wildfly 中使用 JTDS 驱动程序的服务器连接

SQL Server connection in Wildfly using JTDS driver

在 Widlfly 上设置 SQL 服务器数据源的正确方法是什么?

我需要从我在 Wildfly 上运行的 Web 应用程序访问 SQL 服务器数据库。

我已经按如下方式设置了数据源:

<datasource jta="false" jndi-name="java:jboss/db" pool-name="db" enabled="true" use-ccm="false">
    <connection-url>jdbc:jtds:sqlserver://IP_ADDRESS;instance=SQLEXPRESS;DatabaseName=DB</connection-url>
    <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>
    <driver>jtds-1.3.1.jar</driver>
</datasource>

除了当 SQL 服务器重新启动时,连接丢失并且数据源无法重新创建连接外,这工作正常。所以我收到如下错误:

Invalid state, the Connection object is closed.

This post 建议添加一些验证,所以我这样做了:

<validation>
    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
    <validate-on-match>false</validate-on-match>
    <background-validation>false</background-validation>
</validation>

但这并不能解决问题,我仍然时不时遇到相同的 "connection closed" 错误。

This other post 建议使用 DataSource 而不是 Driver,因此我已将其添加到我的配置中:

    <datasource-class>net.sourceforge.jtds.jdbcx.JtdsDataSource</datasource-class>

但是当我测试连接时出现异常:

java.sql.SQLException: The serverName property has not been set.
at net.sourceforge.jtds.jdbcx.JtdsDataSource.getConnection(JtdsDataSource.java:150)

我在迁移到 WFLY 后遇到了同样的问题并通过添加属性解决了它。

这是我完整的 *-ds.xml 的样子:

 <?xml version="1.0" encoding="UTF-8"?>
 <datasources xmlns="http://www.jboss.org/ironjacamar/schema">
  <datasource jndi-name="java:/xxxDS" pool-name="MSSQL">
     <connection-url>
     jdbc:sqlserver://localhost:1433;database=dbname;charset=UTF-8
     </connection-url>
     <driver>sqljdbc</driver>
     <security>
        <user-name>xxx</user-name>
        <password>xxx</password>
     </security>
     <pool>
        <!-- default is 0 -->
        <min-pool-size>10</min-pool-size>
        <!-- default is 20 -->
        <max-pool-size>50</max-pool-size>
     </pool>
     <validation>
        <valid-connection-checker 
        class-name="org.jboss.jca.adapters.jdbc.extensions.mssql.MSSQLValidConnectionChecker" />
        <validate-on-match>false</validate-on-match>
        <background-validation>true</background-validation>
        <check-valid-connection-sql>select 1</check-valid-connection-sql>
        <background-validation-millis>10000</background-validation-millis>
     </validation>
  </datasource>

对我来说,valid-connection-checker 是不够的,但是通过添加带有 select 1 的后台验证,它可以正常工作。

我们已经转而使用直接来自 MSFT 的 jdbc 驱动程序:

<driver name="sqljdbc" module="mc.jdbc.sqljdbc">
  <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
</driver>

这也可能有所不同,但是我们已经用 JBoss AS7 和 jdts 驱动程序设置了很长时间。