0

当我登录我的程序并将其放置一分钟左右时出现此错误:

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;
        }
    }
}
4

2 回答 2

0

添加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");
于 2013-04-23T17:27:28.747 回答
0

我建议你实现一个连接池库来处理数据库连接。不建议使用 autoReconnect 标志来重新建立死/陈旧的连接

在任何情况下,都没有 100% 安全的方法可以让 JDBC 驱动程序在 TCP/IP 连接中断时自动重新连接,而不会冒损坏数据库“状态”(即使事务语义)的风险,这就是为什么这个特性最终会被移除。资源

下面是一个基于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

于 2013-04-23T18:00:15.810 回答