【问题标题】:Error loading MySQL after some time一段时间后加载 MySQL 时出错
【发布时间】:2013-03-16 22:54:23
【问题描述】:

我正在创建一个使用 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;
    }

}

}

任何帮助。

【问题讨论】:

    标签: java mysql timer refresh


    【解决方案1】:

    当您使用 finally 退出 try-catch 块时,请务必关闭您的 statement。您的connection 也是如此。更好更快的是重用 connection 并在程序结束时关闭它。

    在 java 7 中你可以这样做:

    try (Connection con = DriverManager.getConnection(dbname, username, password);
          Statement statement = con.createStatement()) {
       ..CODE..
    }
    

    在较旧的 java 中:

    试试{

        //YOUR CODE
    
      } catch (final Exception e) {
    
         //YOUR CODE
    
      } finally {
         try {
            if (statement != null) {
               statement.close();
            }
         } catch (SQLException e) {
            // error handling
         }
    
         try {
            if (con != null) {
               con.close();
            }
         } catch (SQLException e) {
         // error handling
         }
      }
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 如果您调用selectRoom_ExtByRoom_Room,您将创建一个新的数据库连接。如果您从计时器中调用它,则每次滴答都会创建一个新的数据库连接。罪魁祸首是con = DriverManager.getConnection(dbname,username,password);,它应该首先检查con是否已经是一个有效的连接
      【解决方案3】:

      正确的做法是:

          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 所说的做了一段时间后它也崩溃了

      【讨论】:

        猜你喜欢
        • 2011-06-10
        • 1970-01-01
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 2017-03-15
        • 2015-12-25
        • 2012-06-23
        • 1970-01-01
        相关资源
        最近更新 更多