开发者社区> 问答> 正文

sqlserver2008 连接中断后,可以自动重连问题解决

在实际项目(多数据源)中发现sqlserver连接中断后,无法支持自动重连,拿不到connect:

1.首先通过我的监控页面发现 sqlserver配置的连接池 连接有效性检查类名 为 null。

2.跟踪代码 com.alibaba.druid.pool.DruidDataSource.java initValidConnectionChecker() 方法中, 必须对应是“com.microsoft.jdbc.sqlserver.SQLServerDriver”才会实例化连接有效性检查类,那就是必须使用msbase.jar版本驱动,而我使用的是jtds-1.2.7.jar

3.解决方式A ,替换驱动为 (msbase.jar mssqlserver.jar msutil.jar)。ops!仍然无法解决,可能是我的数据库 是SQLSERVER2008的问题?

4.解决方式B,在2处initValidConnectionChecker()方法(889行)增加条件判断代码,使用jtds驱动也实例化MSSQLValidConnectionChecker.java()

        else if (realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER)
            ||realDriverClassName.equals("net.sourceforge.jtds.jdbc.Driver")
            ||realDriverClassName.equals("com.microsoft.sqlserver.jdbc.SQLServerDriver")) {
      this.validConnectionChecker = new MSSQLValidConnectionChecker();

}

5.使用jtds.jar测试业务通过,sqlserver断线后可自动重连。(模拟网络中断,又恢复网络的情况,每周有个业务系统凌晨要重启路由)

疑问: 1.三种 sqlserver 驱动 ,(msbase.jar mssqlserver.jar msutil.jar)、(sqljdbc4.jar)、(jtds-1.2.7.jar) 都调用 MSSQLValidConnectionChecker.java 作为校验类是否有其他问题?

2.另外必须配置validationQueryTimeout参数,默认为-1 ,不启动检查.

3.请文少和其他大神评估是否有其他影响,希望采纳意见,我是在1.0.15版本下改的测试没问题,目前jtds-1.2.7.jar 驱动用的企业应该更多。

4.附spring-mybatis.xml 关于sqlserver的连接池配置

原提问者GitHub用户Hisen158

展开
收起
山海行 2023-07-05 21:40:36 283 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    在SQL Server 2008中,如果连接中断后需要自动重连,可以在连接字符串中指定连接参数来实现。具体来说,可以使用以下连接字符串:

    routeros
    Copy
    Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;Connect Timeout=30;Pooling=True;Max Pool Size=100;Min Pool Size=5;Persist Security Info=False;
    其中,重连的关键在于以下几个参数:

    Connect Timeout:指定连接超时时间,单位为秒。如果连接在指定时间内没有建立成功,就会超时并自动重连。

    Pooling:用于指定是否启用连接池,如果设置为True,就会启用连接池,从而实现自动重连。

    Max Pool Size:指定连接池中的最大连接数。

    Min Pool Size:指定连接池中的最小连接数。

    在使用连接字符串时,可以根据实际情况调整这些参数的值。例如,可以将Connect Timeout设置为较大的值,以确保连接超时后能够自动重连;同时,可以适当增加Max Pool Size的值,以提高连接池的容量,从而减少连接不足导致的连接中断问题。

    2023-07-30 09:39:19
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    根据您的描述,您遇到了在连接中断后无法自动重连到SQL Server数据库的问题,并且通过调整Druid连接池的配置和代码,以及更换不同的驱动程序来尝试解决问题。

    针对您的疑问:

    1. 三种不同的SQL Server驱动程序(msbase.jar, mssqlserver.jar, msutil.jar)、(sqljdbc4.jar)和(jtds-1.2.7.jar) 都可以使用MSSQLValidConnectionChecker作为连接有效性检查器。这是因为这些驱动程序都实现了JDBC接口,并提供了适当的方法来进行连接有效性检查。因此,在这种情况下,MSSQLValidConnectionChecker是可以通用的。

    2. 配置validationQueryTimeout参数为-1表示禁用连接有效性检查的超时设置。这意味着连接池将一直等待验证查询的响应,直到查询完成或连接被关闭。在一些情况下,如果连接中断,超时时间设置为-1可能会导致连接长时间处于无效状态。您可以根据实际情况调整超时时间来平衡连接有效性检查和连接重连的性能和可靠性需求。

    3. 根据您的描述,您在1.0.15版本的Druid连接池中进行了测试,并且在使用jtds-1.2.7.jar驱动时解决了连接中断后的自动重连问题。请注意,针对特定的驱动程序和数据库版本,不同的解决方案可能会有所不同。在您的测试中,jtds-1.2.7.jar驱动能够正常工作,但对于其他企业使用的不同版本的数据库和驱动程序,可能需要进一步的测试和验证。

    4. 为了更好地了解您的配置情况,请提供您的spring-mybatis.xml文件中有关SQL Server连接池的配置部分,以便我们能够更详细地评估和提供更准确的建议。

    请注意,以上建议和解决方案是基于您提供的信息和情况的,实际应用中可能会有其他因素和影响。如果您有其他问题或需要进一步的帮助,请提供更多相关的信息,我将尽力回答您的问题。

    2023-07-11 17:13:31
    赞同 展开评论 打赏
  • 如果sqlserver连接中断后,无法支持自动重连,可能是因为sqlserver连接池配置不正确,或者是sqlserver连接池连接有效性检查类无法实例化。
    具体来说,如果你在sqlserver连接池中使用了连接池连接有效性检查类,但是该类无法实例化

    2023-07-11 10:33:13
    赞同 展开评论 打赏
    1. 关于三种SQL Server驱动的连接有效性检查类(MSSQLValidConnectionChecker.java)是否存在其他问题,这取决于具体的驱动实现和版本。不同的驱动可能会有不同的连接有效性检查方式和实现细节。

    2. validationQueryTimeout参数的配置,默认为-1,表示不启用检查超时。这个参数决定了连接池在执行连接有效性检查时的超时时间。如果设置为-1,连接池将等待连接有效性检查完成,不会超时。您可以根据实际情况进行调整,以确保连接有效性检查的效率和准确性。

    3. 关于您的解决方案,增加条件判断代码来实例化MSSQLValidConnectionChecker的方式,可以在使用jtds-1.2.7.jar驱动时实现连接有效性检查。然而,这个修改可能会对连接池的稳定性和性能产生影响。建议您在进行修改之前,进行充分的测试和评估,确保不会引入其他问题。

    4. 关于spring-mybatis.xml中SQL Server连接池的配置,您可以配置连接池的基本属性,如最大连接数、最小空闲连接数、连接超时时间等。同时,您也需要配置连接池所使用的驱动、数据库URL、用户名和密码等信息。

    对于SQL Server连接中断后自动重连的问题,您可以通过调整连接池的配置和选择适当的驱动来实现。

    2023-07-06 15:16:01
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载