【问题标题】:Too many connection in java jdbcjava jdbc中的连接太多
【发布时间】:2017-06-23 11:40:39
【问题描述】:

错误:- 严重:空 com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多” 代码如下所示

   try {
        BufferedReader br=new BufferedReader(new FileReader(filename));
        String line;
        String tru="TRUNCATE `project`.`uploadtable`;";
        try
       {
             Statement stmt = Dutil.getConnection().createStatement();



     stmt.executeUpdate(tru);
        }
        catch(Exception e){}
        try {
            while((line=br.readLine())!=null){
                String values[]=line.split("\t");
                String[] splitStr = values[1].split(" ");


               try {String  sql="INSERT INTO `project`.`uploadtable` 
            (`empid`, `date`, `time`, `in_out_index`) VALUES 
            ('"+values[0]+"', '"+splitStr[0]+"', '"+splitStr[1]+"', 
             '"+values[3]+"');";
                    PreparedStatement 
                   pst=Dutil.getConnection().prepareStatement(sql);
                    pst.executeUpdate();
                } catch (SQLException ex) {
                    System.out.println("Error");

             Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE, 
              null, ex);
                }
            } br.close();

             this.dispose();
           LogButtonFrame lbf=new LogButtonFrame();
          lbf.clockinouttable();
           JOptionPane.showMessageDialog(null,"Upload Complete");} catch 
           (IOException ex) {
            Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE, 
          null, ex);
            }
             } catch (FileNotFoundException ex) {
           Logger.getLogger(UploadFrame.class.getName()).log(Level.SEVERE, 
            null, ex);
          }
          catch (Exception ex) {
         JOptionPane.showMessageDialog(null, "Error");
        }

【问题讨论】:

  • 请发布您的代码不要使用图片
  • 您需要在使用完语句和连接后关闭它们,否则它们将保持打开状态,并且在某些时候您会收到此错误。见:Processing SQL Statements with JDBC

标签: java swing jdbc


【解决方案1】:

问题是:

PreparedStatement pst = Dutil.getConnection().prepareStatement(sql);

您还没有显示Dutil 的代码,但假设它在每次调用时创建一个新连接,这意味着连接没有关闭,这取决于运气、驱动程序实现细节和垃圾收集器来获取它关闭了。

你应该使用try-with-resources:

try (Connection connection = Dutil.getConnection();
     PreparedStatement pst = connection.prepareStatement(sql)) {
    // Use pst
}

在这个block结束后,pst和connection都会被正常关闭,即使发生异常等等。

【讨论】:

    【解决方案2】:

    您似乎在创建连接,但从未关闭它们,尽管从您发布的图像中很难分辨出来。

    【讨论】:

    • 在哪里关闭连接?
    • 您在哪里执行 INSERT 语句。您应该考虑使用try / catch / finally 或try with resources。互联网上有很多示例,我想 Jesper 在您的问题的评论中添加的链接会详细介绍它
    【解决方案3】:

    如果您的应用程序需要多个连接,则应使用 Apache DB 连接池等连接池,您可以在其中配置连接数。这是 DBCP 文档的链接https://commons.apache.org/proper/commons-dbcp/

    如果您确定您的应用程序只需要一个连接,请将您的连接对象设置为 DBUtil 类中的 Singleton 对象。这肯定会解决问题,无需关闭连接。您的整个应用程序将使用单个连接对象连接到数据库。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-22
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 2016-08-14
      • 2010-10-03
      • 2011-10-10
      • 1970-01-01
      相关资源
      最近更新 更多