Search code examples
sql-serverjakarta-eejbosswildflyjtds

SQL Server connection in Wildfly using JTDS driver


What is the correct way to setup a SQL Server datasource on Widlfly?

I need to access a SQL Server database from my web application which runs on Wildfly.

I have setup the datasource as follows:

<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>

This works fine except that when the SQL Server is restarted, the connection is lost and the datasource doesn't manage to recreate one. So I get errors like:

Invalid state, the Connection object is closed.

This post suggests adding some validation, so I did this:

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

But that does not solve the problem and I still get the same "connection closed" error from time to time.

This other post suggests using a DataSource instead of a Driver, so I have added this to my configuration:

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

But when I test the connection I get an exception:

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


Solution

  • I was having the same issue after migrating to WFLY and resolved it by adding the properties.

    This is what my complete *-ds.xml looks like:

     <?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>
    

    For me, the valid-connection-checker was not adequate, but by adding the background validation with select 1 it was working.

    We have moved over to using the jdbc driver directly from MSFT however:

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

    That also might make a difference, however we had it set up with JBoss AS7 and the jdts driver for a long time.