2011-10-25 118 views
2

我目前在一个涉及mysql的java程序中工作。我遇到了一个问题这些消息:设置MySql的wait_timeout会话变量

通信链路故障。从服务器成功收到的最后一个数据包 为174,165,153毫秒前。最后一个数据包成功发送到服务器 是4毫秒前。

我相信这与会话变量'wait_timeout'有关。我的假设可能是错误的,所以我在此确认。这真的是因为'wait_timeout'会话变量?这个错误是否意味着我的数据库连接“已过期”,因为会话超时已经失效?如果是的话,我有另一个问题..我不能重现上述错误..

这是我想要复制错误。

  1. 设置wait_timeout变量5这是原本28800(8个小时)。

    mysql> set session wait_timeout=5;

  2. 考虑到我的下一次尝试访问数据库将应用此,我将运行这段代码:

    Class.forName("com.mysql.jdbc.Driver"); 
        oConnection = DriverManager.getConnection(sUrl,sUser,sPass); 
        System.out.println("Database Connection Established.\n"); 
        Thread.sleep(6000); 
    
        executeSimpleQuery(); 
    

    executeSimpleQuery()功能只是执行一个简单的SELECT * FROM语句来检查连接是否还在工作。显然,如果wait_timeout只有5,并且让线程休眠6秒,连接现在就会过期,并且应该产生错误。但是,预期的结果不会发生,而是执行查询。

我该怎么做才能复制错误?

回答

2

您为当前会话设置了wait_timeout = 5;然后打开另一个会话(在Java应用程序中)并执行查询。尝试在打开连接后设置此变量,或者在全局范围内设置它。

例如 -

SET @@global.wait_timeout = 15; -- Set global variable 
SET @@local.wait_timeout = 25; -- Set session variable 
SELECT @@global.wait_timeout, @@local.wait_timeout; -- Check global and session variables 
+0

非常感谢你这一点。虽然我没有使用wait_timeout的全局设置,因为我需要处理每个会话的连接。再次感谢 – Oneb