首页 > 其他分享 >JDBC的超时时间和常用配置

JDBC的超时时间和常用配置

时间:2023-08-09 14:55:53浏览次数:36  
标签:常用 JDBC connectTimeout 数据库 超时 连接 连接池

案例:2019年在对数据库中间件ProxySQL滚动升级时,另一台虚机意外重启导致ProxySQL服务不可用,上层服务出现大量异常访问慢的情况的,通过jstack分析线程情况发现业务系统停止在JDBC的调用上,日志中大量的waiting状态的线程;导致服务长时间处于不可以用的状态,后经过重启服务解决问题;

为什么数据库中间件出现问题之后应用服务器需要重启才能解决访问异常和访问慢的问题?为什么数据库恢复之后程序不能自动连接?

分析:

1、程序和mysql数据库之间通信采取的长连接的形式,一般在建立连接的时候会设置一个超时时间(connectTimeout),适用于网络状况正常的情况下,两端连接所用的时间,如果超过这个时间就会主动断开。在应用服务器启动的时候会初始化若干个连接,这些连接和数据库一直保持着长连接,当程序有数据库请求时会从连接池获取一个可用的连接。

2、JDBC与数据库通信是采用Socket方式处理的,数据库当做一个SocketServer的提供方.

3、当SocketServer返回数据的时候(类似于SQL结果集的返回)其流程是:服务端程序数据(数据库) -> 内核Socket Buffer -> 网络 -> 客户端Socket Buffer -> 客户端程序JDBC所在的JVM内存; 在数据库被突然停掉或是发生网络错误时由于TCP/IP的结构原因,socket没有办法探测到网络错误,因此应用也无法主动发现数据库连接断开。如果没有设置socket timeout的话,应用在数据库返回结果前会无期限地等下去,这种连接被称为dead connection。

4、当底层数据库中间库出问题之后JDBC连接数据没有设置超时时间(connectTimeout)就不能及时反馈连接已经中断,会一直等待中;这个时候数据库连接中初始化的连接也处于不知道连接已经中断的情况,当程序需要操作数据库的时候从连接池中获取连接去使用就会报错

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure  
The last packet sent successfully to the server was 0 milliseconds ago. 
The driver has not received any packets from the server

连接池中的连接被数据库关闭了,应用通过连接池getConnection时,都可能获取到这些不可用的连接,且这些连接如果不被其他线程回收的话,它们不会被连接池被废除,也不会重新被创建,占用了连接池的名额。项目本身作为服务端,数据库链接被关闭,客户端调用服务端就会出现 大量的timeout,客户端设置了超时时间,然而主动断开,服务端必然出现close_wait ,由于tomcat 默认最大线程数是200(server.tomcat.max-threads=200),很快就挂掉。

5、服务在启动的时候 jdbc的connectiontimeout、sockettimeout如果没有设置默认为0,是永远不会超时的。数据库或者网络出现异常程序就会一直等待中;

概念:

connectTimeout

指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。

socketTimeout

指客户端从服务器读取数据的timeout,超出后会抛出SocketTimeOutException

超时时间配置实例:

jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF8&connectTimeout=60000&socketTimeout=60000

JDBC常用配置

  1. user 数据库用户名(用于连接数据库)
  2. password 用户密码(用于连接数据库)
  3. useUnicode是否使用Unicode字符集
  4. characterEncoding 当useUnicode设置为true时,指定字符编码
  5. autoReconnect 当数据库连接异常中断时,是否自动重新连接
  6. autoReconnectForPools 是否使用针对数据库连接池的重连策略
  7. failOverReadOnly 自动重连成功后,连接是否设置为只读
  8. maxReconnects autoReconnect设置为true时,重试连接的次数
  9. initialTimeout autoReconnect设置为true时,两次重连之间的时间间隔,单位:秒
  10. connectTimeout 和数据库服务器建立socket连接时的超时,单位:毫秒, 0表示永不超时
  11. socket操作(读写)超时,单位:毫秒,0表示永不超时

标签:常用,JDBC,connectTimeout,数据库,超时,连接,连接池
From: https://www.cnblogs.com/yanglang/p/17616847.html

相关文章

  • C# list常用的几个操作 改变list中某个元素的值 替换某一段数据
    1、改变list中某个元素的值publicclasstb_SensorRecordModel{publicintID{get;set;}publicdecimalValue1{get;set;}}List<tb_SensorRecordModel>list=newList<tb_SensorRecordModel>();li......
  • pyinstaller常用参数
    `-F,–onefile打包一个单个文件,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用-D,–onedir打包多个文件,在dist中生成很多依赖文件,适合以框架形式编写工具代码,我个人比较推荐这样,代码易于维护-K,–tk在部署时包含TCL/TK-a,–ascii不包含编码.在......
  • 分享 Java 开发中常用到的设计模式(一)
    分享Java开发中常用到的设计模式(一)前言不知道大家在开发的时候,有没有想过(遇到)这些问题:大家都是按需要开发,都是一个职级的同事,为什么有些人的思路就很清晰,代码也很整洁、易懂;而自己开发,往往不知道怎么下手设计,写完了也是bug一堆,codereview的时候更是频频被怼...感觉每天都是......
  • 常用注解之@PathVariable与@RequestParam详解
    @PathVariable和@RequestParam首先说一下Request了解一下请求参数是什么在访问各种各样网站时,经常会发现网站的URL的最后一部分形如:?xxxx=yyyy&zzzz=wwww。这就是HTTP协议中的Request参数,它有什么用呢?先来看一个例子:在知乎中搜索web浏览器跳转到新页面后,URL变为https://www.zhih......
  • 软件测试|pip常用命令总结
    当使用Python进行开发时,pip是一个非常有用的包管理工具,它可以帮助我们方便地安装、升级和管理Python包。本文将介绍一些常用的pip命令,以帮助您更好地使用pip。查看帮助文档运行pip--help运行这个命令将帮助我们更好地了解pip的使用,pip命令的参数会完整展示出来,如下:pip--helpUsa......
  • Redis常用命令_字符串操作命令
          ......
  • 记录:jdbc调用sqlserver存储过程
    1、现场为内网环境,不利于测试2、调用sqlserver存储过程,报错:为过程或函数**指定了过多的参数一、制作本地sqlserver环境1、docker安装sqlserver#获取镜像dockerpullmcr.microsoft.com/azure-sql-edge#启动账号:sa密码:Password@dockerrun-e'ACCEPT_EU......
  • 常用服务器端口有哪些,安全性怎么样
    常用的服务器端口主要用于各种网络服务和应用程序。以下是一些常见的服务器端口及其对应的服务:80-HTTP:用于常规的网页浏览,是网站访问的默认端口。443-HTTPS:用于加密的网页浏览,提供更安全的数据传输。21-FTP:用于文件传输协议,用于上传和下载文件。22-SSH:用于安全外部访问服务......
  • Docker使用教程及常用命令
    Docker是一个开源的应用容器引擎,允许开发者将应用以及依赖打包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows上。它非常适用于持续集成与持续交付(CI/CD)。1.安装Docker首先,你需要在你的服务器上安装Docker。根据你的操作系统,可以选择适合的安装方法。(1)对于Ubunt......
  • windows下常用的nginx命令
    startnginx:启动nginxnginx.exe-cconf/nginx.conf按照指定配置去启动nginxnginx-t-cconf/nginx.conf :检测nginx是否配置正确nginx-sreload :修改配置后重新加载生效nginx-sstop :快速停止nginx,可能并不保存相关信息.nginx-s quit :完整有序的停止ngi......