Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
长锁表期间与MySQL的通信链接失败_Mysql_Table Locking - Fatal编程技术网

长锁表期间与MySQL的通信链接失败

长锁表期间与MySQL的通信链接失败,mysql,table-locking,Mysql,Table Locking,我遇到了一些奇怪的行为。我有一个Java程序,它使用准备好的语句和批插入将数据永久写入MySQL表。如果其他进程发出一个锁TABLES t WRITE,然后不久(几分钟后)将其释放,Java程序将按预期继续运行。但是,当锁定持续较长时间(超过30分钟)时,Java程序会断开连接,不再继续。2小时后,它会出现通信链路故障。在表锁定期间挂起的insert语句在释放锁后执行,但随后连接消失 详情如下: 它发生在MySQL 5.0.51a和5.1.66上 我正在使用最新的JDBC驱动程序mysql-c

我遇到了一些奇怪的行为。我有一个Java程序,它使用准备好的语句和批插入将数据永久写入MySQL表。如果其他进程发出一个
锁TABLES t WRITE
,然后不久(几分钟后)将其释放,Java程序将按预期继续运行。但是,当锁定持续较长时间(超过30分钟)时,Java程序会断开连接,不再继续。2小时后,它会出现通信链路故障。在表锁定期间挂起的insert语句在释放锁后执行,但随后连接消失

详情如下:

  • 它发生在MySQL 5.0.51a和5.1.66上
  • 我正在使用最新的JDBC驱动程序mysql-connector-5.1.25-bin.jar
  • 等待超时设置为28800(8小时)
  • 通信链路故障的堆栈跟踪和Java程序如下所示
有人知道这里发生了什么吗?是否有需要设置/增加的超时


两小时后引发的异常:

完整的Java程序:


最后,我发现了真正的原因。MySQL的
wait\u timeout
与问题无关——只要语句正在运行(无论运行多长时间),数据库会话就不会处于
SLEEP
状态,因此MySQL永远不会关闭会话

原因似乎是Linux操作系统(Debian 6或7),它在空闲2小时后关闭tcp连接(具体机制我不知道,也许有人可以详细说明一下?)


为了避免所描述的超时,需要发送更频繁的tcp保持活动数据包。为此,必须减少
/proc/sys/net/ipv4/tcp\u keepalive\u时间(我将其从7200减少到60)<代码>cat 60>/proc/sys/net/ipv4/tcp\u keepalive\u time
临时执行此操作;要在系统重新启动后保留它,必须在
/etc/sysctl.conf
中设置
net.ipv4.tcp\u keepalive\u time=60
,我只需搜索相同的问题。我想我的回答可以帮助你

  • 查看您的异常
  • 从服务器成功接收的最后一个数据包是7.260.436毫秒前

    这显然意味着7.260.436毫秒<等待超时设置为28800

    2.如果您的应用程序因为等待超时太小而引发异常。例外情况如下所示:

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 46,208,149 milliseconds ago. The last packet sent successfully to the server was 46,208,150 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. ; SQL []; The last packet successfully received from the server was 46,208,149 milliseconds ago. The last packet sent successfully to the server was 46,208,150 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.; com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收的最后一个数据包是46208149毫秒前。最后一个成功发送到服务器的数据包是46208150毫秒前的数据包。长于服务器配置的“等待超时”值。在应用程序使用之前,应考虑对连接有效性进行期满和/或测试,增加客户端超时的服务器配置值,或者使用连接器/J连接属性“AutoReNeNeCT= true”来避免此问题。 ; SQL[];从服务器成功接收的最后一个数据包是46208149毫秒前的数据包。 最后一个成功发送到服务器的数据包是46208150毫秒前的数据包。 长于服务器配置的“等待超时”值。 在应用程序中使用之前,应考虑终止和/或测试连接有效性。 增加客户端超时的服务器配置值, 或者使用连接器/J连接属性“autoReconnect=true”来避免此问题。; 这意味着46208150毫秒前>等待超时

  • 回答 请注意以下关键词“通信链路故障”,这主要与MySQl变量有关:net\u write\u timeout或net\u read\u timeout

    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障 网络写入超时和网络读取超时的默认值很小,您可以执行 mysql> show variables like '%timeout%';
    mysql>显示变量,如“%timeout%”;查找结果。

    我无法更改我的保持活动文件的内容
    tcp\u keepalive\u time”E667:Fsynch已失败
    使用
    vi
    。我必须这样做:
    root@sd-53310:/home/ocatelin#echo 60|sudo dd of=/proc/sys/net/ipv4/tcp_keepalive_time 0+1注册时间加0+1注册时间加3个八位字节(3 B)复印件,24948E-05 s,120 kB/sroot@sd-53310:/home/ocatelin#cat/proc/sys/net/ipv4/tcp#keepalive#u time 60
    com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure mysql> show variables like '%timeout%';