Java通信链接失败后的错误

时间:2013-04-23 17:21:46

标签: java

当我登录我的程序并将其保留一分钟左右时,我收到此错误:

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

2 个答案:

答案 0 :(得分:0)

autoReconnect添加到MySql数据库连接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

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

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

连接代码更新:

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

答案 1 :(得分:0)

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

  

在任何情况下,JDBC驱动程序都没有100%安全的方法   如果TCP / IP连接死亡而没有风险,则自动重新连接   数据库'state'的损坏(甚至 with transactional   语义),这就是为什么这个功能最终会被删除。 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的进一步提及。