【问题标题】:Java communications link failure error afterJava 通信链接失败错误后
【发布时间】:2013-04-23 17:21:46
【问题描述】:

当我登录我的程序并离开它一分钟左右时,我收到了这个错误:

com.mysql.jdbc.exceptions.jdbc4.CommuncationsException: Communications link failure
The last packet succesfully received from the server was 590,905 miliseconds ago. The last packet sent succesfully to the server was (cant remember correct number) miliseconds ago.

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

与数据库的连接到此结束,我的程序不再工作。这是我与 mysql db 配置文件的连接:

import java.sql.*;
import javax.swing.*;
public class mysqlconnect {
    Connection conn = null;
    public static Connection ConnectDb()    {
        try{
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection("jdbc:mysql://MYSERVER.COM/MY_DATABASE","USERNAME","PASSWORD");
            //JOptionPane.showMessageDialog(null, "Connection successfull");
            return conn;
        }catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Cant connect to db");
            return null;
        }
    }
}

在做了一些研究之后,我认为我需要向这个文件添加更多配置,但不确定要添加什么,或者即使我真的需要修改这个文件。有什么建议吗?

只有错误用户名密码的原始代码:

import java.sql.*;
import javax.swing.*;
public class mysqlconnect {
    Connection conn = null;
    public static Connection ConnectDb()    {
        try{
            Class.forName("com.mysql.jdbc.Driver");
            //Connection conn = DriverManager.getConnection("jdbc:mysql://rude.su.lt/data_base1","USERNAME","PASSWORD");
            Connection conn = DriverManager.getConnection("jdbc:mysql://rude.su.lt/data_base1","USERNAME","PASSWORD");
            //JOptionPane.showMessageDialog(null, "Prisijungimas pavyko");
            return conn;
        }catch (Exception e) {
            JOptionPane.showMessageDialog(null, "Prisijungimas prie duomenų bazės nepavyko");
            return null;
        }
    }
}

【问题讨论】:

标签: java


【解决方案1】:

autoReconnect添加到MySql DB连接URL,,,连接丢失时自动重新连接

检查下面的连接代码:

Connection conn = DriverManager.getConnection("jdbc:mysql://MYSERVER.COM/MY_DATABASE?autoReconnect=true","USERNAME","PASSWORD"); 

有关更多 MySQL 连接参数,请查看此链接: http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

还要检查您是否关闭 ConnectionStatement,除非您完成执行 DML 或 DLL

注意: 在您的代码中,您似乎错过了 mysql 3306 的端口(如果您没有更改默认端口)

连接代码更新:

Connection conn = DriverManager.getConnection("jdbc:mysql://MYSERVER.COM:3306/MY_DATABASE?autoReconnect=true","USERNAME","PASSWORD");

【讨论】:

  • 如果您使用的是mysql 5.0.7或以上版本,您可以添加参数tcpKeepAlive并使用true进行设置
  • autoReconnect=true 没有帮助,将尝试tcpKeepAlive
  • 检查答案中的编辑,我用连接端口号更新了代码
  • 似乎没有任何效果,尝试添加端口,尝试tcpKeepAlive - 同样的错误
  • 您是否介意将原始代码与您的配置一起发布..实际上没有密码
【解决方案2】:

我建议您实现一个连接池库来处理数据库连接。不建议对re-establish dead/stale connections 使用 autoReconnect 标志。

在任何情况下,JDBC 驱动程序都无法做到 100% 安全 如果 TCP/IP 连接中断,则自动重新连接而不会冒险 数据库“状态”损坏(甚至 with 事务 语义),这就是为什么这个特性最终会被删除。 Source

下面是一个基于c3p0连接池库的例子。

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver            
cpds.setJdbcUrl( "jdbc:mysql://MYSERVER.COM/MY_DATABASE:MY_PORT");
cpds.set
cpds.setUser("dbuser");                                  
cpds.setPassword("dbpassword");

下面的行会从池中返回一个连接 -

cpds.getConnection(); 

如需进一步了解,请访问c3p0 docs

【讨论】:

    猜你喜欢
    • 2018-03-05
    • 2018-10-15
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多