Java 使用 JDBC - 连接太多?

2023-12-13

我正在为一家酒吧编写一个库存补货系统,作为我的最后一年项目。我可以从 MYSQL 数据库检索信息,并且可以一次滚动浏览一个结果。

我正在尝试根据所选类别更改结果。我已经设法使用组合框来实现此目的,但在类别之间移动时出现以下错误:

线程“main”中出现异常 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接过多”

两个独立文件的代码如下:

  • SQL 查询在RetrieveStockQuery

    public JComboBox getComboBox() throws SQLException {
      con = SQLConnect.getConnection();
      combo = new JComboBox();
      combo.removeAllItems();
      try {
        stat = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
        rs = stat.executeQuery("SELECT categoryName FROM Category");
    
        while (rs.next()) {
          combo.addItem(rs.getString("categoryName"));
          categoryName = rs.getString("categoryName"); 
        }
      }
      catch (SQLException sqle) {
        System.out.println(sqle);
        stat.close();
        con.close();
      }
      return combo;
    }
    
    //----------------------------------------------------------------
    
    public void retrieveStock() throws SQLException { 
    
      con = SQLConnect.getConnection();
      stockGUI = new ViewStockGUI(); // I THINK THIS IS WHAT IS CAUSING THE ERROR   
    
      String viewStock = "SELECT * FROM Stock where categoryName = '" + "'" + stockGUI.selected + "'";
      System.out.println(viewStock);
    
      try {
        stat = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
        rs = stat.executeQuery(viewStock);
    
        while(rs.next()){
          stockID = rs.getInt("stockID");
          stockName = rs.getString("stockName");
          stockDescription = rs.getString("stockDescription");
          stockPrice = rs.getFloat("stockPrice");
          stockQuantity = rs.getInt("stockQuantity");
          categoryName = rs.getString("categoryName");  
    
          ID = Integer.toString(stockID);
          price = Float.toString(stockPrice);
          quantity = Double.toString(stockQuantity);
          stat.close();
          con.close();
    
          System.out.println( "Stock ID: " + stockID + " Stock Name: " + stockName + " Stock Description: " + stockDescription + " Stock Price: " + stockPrice + " Stock Quantity:" + stockQuantity + " Category: " + categoryName);
        }    
      }  
      catch (SQLException err) {
        System.out.println(err.getMessage());   
      }
    }
    
  • My ViewStockGUI class

      public class ViewStockGUI extends JPanel {
    
        private static final long serialVersionUID = 1L;
        final JFrame viewFrame;
        ViewStockQuery stockQuery;
        ViewStockQuery stockName;
        JComboBox comboGUI;
        String selected;
        JComboBox combo;
    
        public ViewStockGUI() throws SQLException {
    
          final ViewStockQuery stock = new ViewStockQuery();
    
          comboGUI = stock.getComboBox();
          stock.retrieveStock();
          viewFrame = new JFrame("View Stock");
    
          JPanel p = new JPanel();
          p.setBorder (new TitledBorder(new LineBorder(Color.black, 1, true)));
          p.setPreferredSize(new Dimension(500,400));
    
          JPanel p2 = new JPanel();
          p2.setBorder (new TitledBorder(new LineBorder(Color.black, 1, true)));
          p2.setPreferredSize(new Dimension(500, 50));
    
          JPanel p3 = new JPanel();
          JPanel p4 = new JPanel();
          JPanel p5 = new JPanel();
          JPanel p6 = new JPanel();
    
          Box box = Box.createVerticalBox();        
          Box box2 = Box.createHorizontalBox();
          Box box3 = Box.createHorizontalBox();
          Box box4 = Box.createHorizontalBox();
    
          final JTextField textfieldStockName;
          final JTextField textfieldStockID;
          final JTextField textfieldStockDescription;
          final JTextField textfieldStockPrice;
          final JTextField textfieldStockQuantity;
          final JTextField textfieldStockCategory;
    
          final JLabel stockName = new JLabel("Name:");
          JLabel stockID = new JLabel("ID:");
          JLabel stockDescription = new JLabel("Description:");
          JLabel stockPrice = new JLabel("Price:");
          JLabel stockQuantity = new JLabel("Quantity:");
          JLabel categoryName = new JLabel("Category:");
    
          box.add(Box.createVerticalGlue());
          box.add(stockName);
          box.add(textfieldStockName = new JTextField(""));
          textfieldStockName.setText(stock.getStockName());
          textfieldStockName.setEditable(false);
    
          box.add(stockID);
          box.add(textfieldStockID = new JTextField(""));
          textfieldStockID.setText(stock.getStockID());
          textfieldStockID.setEditable(false);
    
          box.add(stockDescription);
          box.add(textfieldStockDescription = new JTextField(""));
          textfieldStockDescription.setText(stock.getStockDescription());
          textfieldStockDescription.setEditable(false);
    
          box.add(stockPrice);
          box.add(textfieldStockPrice = new JTextField(""));
          textfieldStockPrice.setText(stock.getStockPrice());
          textfieldStockPrice.setEditable(false);
    
          box.add(stockQuantity);
          box.add(textfieldStockQuantity = new JTextField(""));
          textfieldStockQuantity.setText(stock.getStockQuantity());
          textfieldStockQuantity.setEditable(false);
    
          box.add(categoryName);
          box.add(textfieldStockCategory = new JTextField(""));
          textfieldStockCategory.setText(stock.getStockCategory());
          textfieldStockCategory.setEditable(false);
          box.add(Box.createVerticalGlue());
    
          JButton next = new JButton("Next");
          next.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              stock.doNext();
              textfieldStockName.setText(stock.getStockName());
              textfieldStockID.setText(stock.getStockID());
              textfieldStockDescription.setText(stock.getStockDescription());
              textfieldStockPrice.setText(stock.getStockPrice());
              textfieldStockQuantity.setText(stock.getStockQuantity());
              textfieldStockCategory.setText(stock.getStockCategory());
            }
          }); 
    
          JButton previous = new JButton("Previous");
          previous.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              stock.doPrevious();
              textfieldStockName.setText(stock.getStockName());
              textfieldStockID.setText(stock.getStockID());
              textfieldStockDescription.setText(stock.getStockDescription());
              textfieldStockPrice.setText(stock.getStockPrice());
              textfieldStockQuantity.setText(stock.getStockQuantity());
              textfieldStockCategory.setText(stock.getStockCategory());
            }
          }); 
    
          final Counter counter = new Counter();
          final JLabel text = new JLabel(counter.getValue1());
    
          JButton plus = new JButton("+");
          plus.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              counter.increment();
              text.setText(counter.getValue1());
            }
          }); 
    
        JButton minus = new JButton("-");
        minus.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            counter.decrease();
            text.setText(counter.getValue1());
          }  
        });
    
        JButton update = new JButton("Update");
        update.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            try {
              stock.updateStock(counter.getValue1());
            } 
            catch (SQLException e1) {
              e1.printStackTrace();
            }
            finally { // doesn't update yet; will work on this later
              textfieldStockQuantity.setText(stock.getStockQuantity());
            }
          }
        }); 
    
        comboGUI.addActionListener(new ActionListener() {
          public void actionPerformed(ActionEvent e) {
            try {
              combo = (JComboBox) e.getSource();
              selected = (String)combo.getSelectedItem();
              textfieldStockName.setText(stock.getStockName());
              textfieldStockID.setText(stock.getStockID());
              textfieldStockDescription.setText(stock.getStockDescription());
              textfieldStockPrice.setText(stock.getStockPrice());
              textfieldStockQuantity.setText(stock.getStockQuantity());
              textfieldStockCategory.setText(stock.getStockCategory());
              stockQuery.con.close();
            }
            catch (SQLException e1) {
              e1.printStackTrace();
            }
          }
        }); 
    
    
        box.add(comboGUI);      
        box2.add(previous);
        box2.add(next);
        box3.add(minus);
        box3.add(text);
        box3.add(plus);
        box4.add(update);
    
        p.add(box2);
        p.add(box);
        p.add(box3);
        p.add(box4);
    
        this.add(p, BorderLayout.SOUTH);
      }
    }
    

如果有人可以提供帮助,我们将不胜感激。


当您有太多打开的连接时,您会收到此异常。
这是可配置的,但就您而言,问题出在您的代码中。

您发布的代码很奇怪(至少)。
你要么不关闭连接,除非你得到一个SQLException或者在处理结果集期间关闭它!

无论如何,您应该在完成后重构代码以关闭连接和结果集等。
例子:

try { 

     stat = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE ); 
     rs = stat.executeQuery("SELECT categoryName FROM Category"); 

  while (rs.next()) { 
      combo.addItem(rs.getString("categoryName")); 
      categoryName = rs.getString("categoryName");  


  } 
} catch (SQLException sqle) { 
  System.out.println(sqle);   
} 
finally{
 if(stat != null) stat.close(); 
 if(con != null)  con.close(); 
}

通过将收盘价放在finally您确定连接在正确的流程或异常情况下关闭(我省略了try-catch为了清楚起见)。

因此修改代码以关闭连接。

为了获得更好的性能,您应该考虑连接池

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 使用 JDBC - 连接太多? 的相关文章

随机推荐

  • NSNotificationCenter 与委托(使用协议)?

    它们各自的优点和缺点是什么 我应该在哪里具体使用它们 这里的经验法则是有多少客户希望收到事件通知 如果它主要是一个对象 例如 关闭视图或对单击的按钮进行操作 或对失败的下载做出反应 那么您应该使用委托模型 如果您发出的事件可能同时引起许多对
  • 如何从应用程序调用关闭电源、重新启动对话框?

    当从我的应用程序中长按电源按钮时 我想调用关闭电源 重新启动等对话框 与默认的 Android 对话框相同 我不需要从我的应用程序中直接调用重新启动 关闭电源等 只是想调用该对话框 怎么称呼呢 或如何在应用程序上发送电源按钮键 提前致谢 如
  • Nuxt.js - 是否可以将自定义路径/基设置为静态文件的网址?

    TLDR 如何更改静态文件路径src nuxt
  • 从 .idea 文件夹中忽略什么?

    可能的重复 Intellij Idea 9 10 要签入 或不签入 源代码管理的哪些文件夹 我开始使用 WebStorm 进行 Web 开发 但不确定要添加什么以及要从我们的 Git 存储库中排除什么 显然里面有一些文件 idea文件夹旨在
  • 更改 DataGridViewRow 的轮廓

    如果满足某个条件我想改变轮廓DataGridViewRow蓝色使其脱颖而出 我知道这不是BackColor因为它改变了行的背景颜色 我尝试过改变ForeColor为蓝色但没有任何变化 我不相信这是选择风格 因为这种行为不是我想要的 有什么建
  • WPF:如何使 DataGrid 与动态列的绑定可编辑?

    我需要将一些数据绑定到具有可变列数的 DataGrid 我使用以下代码使其工作 int n 0 foreach string title in TitleList DataGridTextColumn col new DataGridTex
  • 在 Android 上将 HTML 转换为图像(任何格式)[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 有谁知道如何在Android上将html代码 其中包含图像 转换为图像 我知道如何使用 JLabel JEditorPane 和 BufferedImage 在 Java 上实现它 但
  • 具有不可移动、默认可构造值类型的 map/unordered_map

    Update 出现在23 5 4 3中here那m 1 版本应该有效 Update2 m 1 正在使用 gcc4 9 1 具体来说 std mutex 假设我想要一个std unordered map
  • Javascript InnerHTML 删除表单元素中的数据

    我有一个带有按钮的表单 允许您向表单添加字段
  • 如何正确取消初始化 OpenSSL

    在我的 OpenSSL 客户端中 我遇到的问题是 当我选择静态链接 libeay32 和 ssleay32 而不是动态链接时 我从 Visual Leak Detector 收到了大量内存泄漏错误 我从 OP 中复制了命令这个线程 但我还剩
  • R 中多个数据帧的相同功能

    我是 R 新手 这是一个非常简单的问题 我发现了很多与我想要的类似的东西 但并不完全一样 基本上我有多个数据框 我只想在所有数据框上运行相同的函数 for 循环可以工作 但我不确定如何正确设置它来调用数据帧 它似乎也最喜欢使用 R 的 la
  • php exec() 命令权限被拒绝

    我有一个 C 可执行文件 skypeforwarder 如果我在 Mac 的终端中使用命令行 skypeforwarder 就可以工作 亨利 Users henry Desktop skypeForwarder skypekit sdk s
  • 如何按照请求的顺序处理 jquery ajax 请求

    我正在制作一个 java servlet 页面 用于检查域名列表 并通过 jquery ajax 请求检查每个名称 除了结果被乱序附加到 DOM 之外 它工作得很好 什么是按请求顺序处理请求但又像长轮询效果一样异步的最佳方法 我是 Java
  • 在启动时通过UAC授予c++程序管理权限

    所以我做了一些研究 但我有兴趣了解如何让他的程序在执行之前向 UAC 请求管理权限 这是否需要在 ShellExecute 中使用 runas 我意识到这是我在编程冒险中需要理解的事情 因为几乎我安装的每个程序都问过我这个问题 例如 如果我
  • 如何将整数转换为日期对象Python?

    我正在 python 中创建一个模块 在其中我收到整数格式的日期 例如20120213 表示 2012 年 2 月 13 日 现在 我想将这个整数格式的日期转换为 python 日期对象 另外 是否有任何方法可以减去 添加此类整数格式日期中
  • Android R 中的后台服务在省电模式下停止

    我编写了一个 Android 应用程序 通过更改电量来检查电池电量 并在电量达到特定值时发出警报 我在我的应用程序中使用了广播接收器和后台服务 它在所有 Android 版本中都能正常工作 但在 Android R 中 当打开省电模式时 服
  • 是否可以重命名 Firebase 实时数据库中的密钥?

    我想知道有没有办法更新键值 让我们使用以下数据 我正在使用 set 来写入数据 现在 我希望用户编辑他们的bookTitle两个地方都需要改变 我尝试使用 update 但似乎无法使其工作 我只能编辑bookTitle in bookInf
  • 使用 Angular 7 Material CDK 进行嵌套拖放

    我有一个拖放列表的嵌套树 不是树组件 当拖动另一个下拉列表中包含的下拉列表中的项目时 两个下拉列表都会触发 Enter Exit 事件 这意味着当一个项目被删除时 它可以被放入内部下拉列表或容器下拉列表中 具体取决于它被删除的地方 注意 这
  • 共同的偏好和清晰的历史/数据

    如果我在android中使用sharedpreference在应用程序的生命周期内将数据本地存储在设备上 直到应用程序被卸载 当用户选择从android的 gt 菜单 gt 设置 gt 清除数据 时是否有丢失数据的风险管理应用程序 gt 清
  • Java 使用 JDBC - 连接太多?

    我正在为一家酒吧编写一个库存补货系统 作为我的最后一年项目 我可以从 MYSQL 数据库检索信息 并且可以一次滚动浏览一个结果 我正在尝试根据所选类别更改结果 我已经设法使用组合框来实现此目的 但在类别之间移动时出现以下错误 线程 main