Java 一段时间后加载MySQL时出错

Java 一段时间后加载MySQL时出错,java,mysql,timer,refresh,Java,Mysql,Timer,Refresh,我正在创建一个使用JDBC从数据库(MySQL)数据加载的应用程序。我的申请在一段时间内(大约50分钟)运行良好。该程序使用定时器,所以我可以刷新一些JFrame来显示数据库中的更改 问题是,经过一段时间后,它显示从数据库加载时出错,而不是显示加载特定表时出错,而是随机加载表 我正在使用这段代码从数据库中加载,并且我在数据库的许多表中多次使用它 package Mysql; public class SQLRoom { public Connection con = null; public

我正在创建一个使用JDBC从数据库(MySQL)数据加载的应用程序。我的申请在一段时间内(大约50分钟)运行良好。该程序使用定时器,所以我可以刷新一些JFrame来显示数据库中的更改

问题是,经过一段时间后,它显示从数据库加载时出错,而不是显示加载特定表时出错,而是随机加载表

我正在使用这段代码从数据库中加载,并且我在数据库的许多表中多次使用它

package Mysql;


public class SQLRoom {
public Connection con = null;
public Statement statement= null;
public String JDBC_DRIVER = "com.mysql.jdbc.Driver";
public String username = new String("bonis");
public String password = new String("bonis");
static String dbname = "jdbc:mysql://localhost/pbx";

public String selectRoom_ExtByRoom_Room(String room) {
    try {
        Class.forName(JDBC_DRIVER);
        con = DriverManager.getConnection(dbname,username,password);
        statement= con.createStatement();

        String query = "select * from room where room_room = '" +room+"'";

        String phoneNumber = null;

        final ResultSet rs1=statement.executeQuery(query);
        while (rs1.next()) {

            phoneNumber =rs1.getString("room_ext");

        }
        return phoneNumber;

    }
    catch (final Exception e) {
        JOptionPane.showMessageDialog(null,"SQLRoom selectRoom_ExtByRoom_Room  room:" +room+" room length"+ room.length());
        return null;
    }

}

}

任何帮助

我怀疑您在每次定时器滴答声时都会打开一个新的数据库连接,而不再释放它-这将耗尽可用的连接,直到它们达到零


确保只打开一次DB连接,然后在每个计时器滴答声中引用它。

请确保在使用
finally
退出try-catch块时关闭
语句。您的
连接也是如此。更好更快的方法是重用
连接
,并在程序结束时将其关闭

在java 7中,您可以这样做:

try (Connection con = DriverManager.getConnection(dbname, username, password);
      Statement statement = con.createStatement()) {
   ..CODE..
}
在旧版java中:

试一试{


正确的做法是:

    if (con == null){
        try {
            con = DriverManager.getConnection(dbname,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (statement == null){
        try {
            statement= con.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }`

原因虽然我按照vhunsicker说的做了一段时间后,如果你调用
selectRoom\u ExtByRoom\u Room
你会创建一个新的数据库连接。如果你从计时器调用它,你会在每个滴答声中创建一个新的数据库连接。罪魁祸首是
con=DriverManager.getConnection(dbname,username,password);
,如果
con
已经是一个有效的连接,那么应该首先检查它
    if (con == null){
        try {
            con = DriverManager.getConnection(dbname,username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (statement == null){
        try {
            statement= con.createStatement();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }`