使用HikariCP + Spring + MS SQL Server的JTDS配置

6

我一直在搜索如何配置JTDS (1.3.1) 以便与 HikariCP (2.4.3), Spring (4.1.2), 和 MS SQL Server (2008) 一起使用,但是无法找到一个完整且可用的示例。

以下是我的配置:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfig" />
</bean> 

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="springHikariCP" />
    <property name="connectionTestQuery" value="SELECT 1" />
    <property name="dataSourceClassName" value="${jdbc.dataSourceClassName}" />
    <property name="maximumPoolSize" value="${jdbc.maximumPoolSize}" />
    <property name="minimumIdle" value="${jdbc.minimumIdle}" />
    <property name="idleTimeout" value="${jdbc.idleTimeout}" />
    ....
    <property name="dataSourceProperties">
        <props>
            ....
        </props>
    </property>
</bean>

有人能分享一下在生产环境中使用的JTDS配置吗?

谢谢。

更新

我找到了这篇SO文章:

HikariCP连接getConnection时挂起

看来JTDS在与HikariCP一起工作时存在问题。实际上,我也遇到了这个问题。这是我的完整JTDS配置:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="hikariConfig" />
</bean> 

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="springHikariCP" />
    <property name="connectionTestQuery" value="${jdbc.connectionTestQuery}" />
    <property name="dataSourceClassName" value="${jdbc.dataSourceClassName}" />
    <property name="maximumPoolSize" value="${jdbc.maximumPoolSize}" />
    <property name="minimumIdle" value="${jdbc.minimumIdle}" />
    <property name="idleTimeout" value="${jdbc.idleTimeout}" />
    <property name="connectionTimeout" value="${jdbc.connectionTimeout}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="dataSourceProperties">
        <props>
            <prop key="user">${jdbc.username}</prop>
            <prop key="password">${jdbc.password}</prop>
            <prop key="cacheMetaData">${jtds.cacheMetaData}</prop>                              
        </props>
    </property>
</bean>

这正是我发布问题的原因,我希望能看到一个完整的例子。然而,在HikariCP的页面上,JTDS被列为支持的内容。我感到困惑。


2
如果您正在使用SQL Server,我强烈建议使用“cacheMetaData=true”。如果您有包含大量行(数千行)的ResultSets,则建议使用“useCursors=true”,并根据需要在每个Statement上设置“Statement.setFetchSize()”(SQL Server默认为每次100行)。 - brettw
brettw,非常感谢您的回复!我确实使用MS SQL Server。我忘了提到它。为什么不把您的回答做成完整的答案呢?我会选择它。另外,我不知道如何添加数据库URL。祝好。 - curious1
brettw,在我的应用程序中,我总是通过Spring Data显示分页结果。在这种情况下,“我建议使用useCursors=true并根据需要设置每个语句的Statement.setFetchSize()”仍然正确吗?最好的。 - curious1
4个回答

6
以下内容可行:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close" depends-on="flyway">
    <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/>
    <property name="connectionTestQuery" value="SELECT GETDATE()"/>
    <property name="maximumPoolSize" value="32"/>
    <property name="jdbcUrl" value="${dbUrl}"/>
    <property name="username" value="${dbUsername}"/>
    <property name="password" value="${dbPassword}"/>
</bean>

注意connectionTestQuery属性,它是必需的,这样Hikari就不会假设驱动程序符合JDBC4标准(jTDS符合3.0标准)。


2

根据@roded的建议,我按照以下方式实现了它,并且对我有效。

    @Bean
    public JdbcTemplate jdbcTemplate() {
        HikariConfig c = new HikariConfig();
        c.setDriverClassName("net.sourceforge.jtds.jdbc.Driver");
        c.setConnectionTestQuery("SELECT GETDATE()");
        c.setMaximumPoolSize(32);
        c.setJdbcUrl("jdbc:jtds:sqlserver://serverIp:1433/DBName;");
        c.getDataSourceProperties().put("user", "user");
        c.getDataSourceProperties().put("password", "password");
        c.getDataSourceProperties().put("cacheMetaData", true);

        HikariDataSource hds = new HikariDataSource(c);

        JdbcTemplate jdbcTemplate = new JdbcTemplate(hds);

    return jdbcTemplate;
}

1
谢谢你,你救了我的一天...:-)..我使用的URL是这样的jdbc:jtds:sqlserver://1.1.1.1:1433/test;domain=Test;useNTLMv2=true; - Akhil Babu Korkandi

0

在我的配置中,仅仅添加一个验证查询(ConnectionTestQuery)并不能让它正常工作。
最终我不得不将我的JtdsDataSource包装在HikariDataSource中才能使其正常工作。

在一个@Configuration类中实现。

   public DataSource getDataSource()
   {
      //initial JtdsDataSource to control the DB connection
      JtdsDataSource ds = new JtdsDataSource();

      ds.setDomain(this.domain);
      ds.setServerName(this.server);
      ds.setDatabaseName(this.database);
      ds.setUser(this.user);
      ds.setPassword(this.password);

      //settings for integrated authentication to work.
      ds.setSsl(SSL_REQUEST); //static import from net.sourceforge.jtds.ssl.Ssl
      ds.setUseNTLMV2(true);

      //WRAP JTDS in a Hikari Datsource
      HikariConfig hc = new HikariConfig();
      hc.setDataSource(ds);
      hc.setConnectionTestQuery("SELECT 1");

      HikariDataSource hds = new HikariDataSource(hc);
      return hds;
   }

-1

这两种方法对我都有效。我能够正确地使用数据库连接。

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">  
      <property name="poolName" value="tmmConnPool"/>
      <property name="connectionTestQuery" value="SELECT 1"/>    
      <property name="driverClassName" value="net.sourceforge.jtds.jdbc.Driver"/>
      <property name="maximumPoolSize" value="10"/>
      <property name="jdbcUrl" value="jdbc:jtds:sqlserver://127.0.0.1:1433/users;domain=workgroup"/>
      <property name="username" value="sa"/>
      <property name="password" value="admin"/>
    </bean>

    <!-- OR -->

     <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">  
      <property name="poolName" value="tmmConnPool"/>
      <property name="connectionTestQuery" value="SELECT 1"/>    
      <property name="dataSourceClassName" value="net.sourceforge.jtds.jdbcx.JtdsDataSource"/>
      <property name="maximumPoolSize" value="10"/>
      <property name="dataSourceProperties">
         <props>
           <prop key="user">sa</prop>
           <prop key="password">admin</prop>
           <prop key="serverName">127.0.0.1</prop>    
           <prop key="portNumber">1433</prop>    
           <prop key="databaseName">users</prop>    
           <!-- For SQLServer value is 1 -->   
           <prop key="serverType">1</prop>   
           <prop key="domain">workgroup</prop>                    
          </props>
      </property>
    </bean>  

    <!-- Reference of above databSource, both options given above works -->

    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">  
       <constructor-arg ref="hikariConfig"/>  
    </bean>  

除此之外,我还能够使用Java实现建立连接

public Connection getConnectionFromPool() {
        final HikariConfig hikariCfg = new HikariConfig();
        hikariCfg.setPoolName("tmmConnectionPool");
        hikariCfg.setDataSourceClassName("net.sourceforge.jtds.jdbcx.JtdsDataSource");
        hikariCfg.setConnectionTestQuery("SELECT 1");
        hikariCfg.setMaximumPoolSize(10);
        hikariCfg.getDataSourceProperties().put("user", "sa);
        hikariCfg.getDataSourceProperties().put("password", "admin");
        hikariCfg.getDataSourceProperties().put("serverName", "127.0.0.1");
        hikariCfg.getDataSourceProperties().put("portNumber", "1433");
        hikariCfg.getDataSourceProperties().put("databaseName", "users");
        hikariCfg.getDataSourceProperties().put("serverType", "1");
        hikariCfg.getDataSourceProperties().put("domain", "workgroup");


        final HikariDataSource hikariDs = new HikariDataSource(hikariCfg);
        Connection conn = null;
        try {
            conn = hikariDs.getConnection();
        } catch (SQLException excp) {
            LOGGER.error("Exception occurred while getting connection from dataSource", excp);
        } finally {
            if (hikariDs !=null) {
                hikariDs.close();
            }
        }
        return conn;
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接