JDBC连接太多错误

Posted

技术标签:

【中文标题】JDBC连接太多错误【英文标题】:JDBC Too Many Connections Error 【发布时间】:2017-01-03 17:38:20 【问题描述】:

我知道这可能是其他人的类似问题,(最初,在我尝试新事物之前,它有点独特,但从未解决主要问题),但我可能需要与能够帮助,因为尽管我已经阅读了该站点的各种帖子,但我永远无法了解导致此问题的原因。底线是我需要继续进行大量的顺序查询,但我最终建立了太多的连接。

我的程序所做的是显示每个成员的数据,并且它有点像树或网络,为了获取每个成员所需的数据,你必须搜索所有其他指向该成员的成员当前成员(或孩子的数据),以及指向当前成员的成员的成员的数据(或孙的数据)等等。因此,为什么我需要继续进行查询,因为我需要从每个孩子身上获取数据。我认为每个节点至少有 5 个子节点,在我的第 34 个成员中,它发出了“连接太多”错误。

我已经阅读了如何打开和关闭连接,但我仍然做错了吗?我试过改变最大连接数,但这对我来说并不是一个长期的解决方案。这是我的做法:

public class SQLConnect 

private Connection con;
private Statement st;
private ResultSet rs;

public SQLConnect() 
    try 
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname?zeroDateTimeBehavior=convertToNull", "root", "");
        st = con.createStatement();

     catch (ClassNotFoundException | SQLException ex) 
        System.out.println("Error in constructor: " + ex);
    


//this method gets called before I make another query
public void reconnect() 
    try 
        st.close();
        con.close();
        if (con.isClosed()) 
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "root", "");
            st = con.createStatement();
        
     catch (SQLException ex) 
        Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex);
    


//sample method on how I do queries
public ResultSet getMemberViaMemberId(String mID) 
    try 
        String query = "CALL getMemberViaMemberId(" + mID + ");"; //procedure call
        rs = st.executeQuery(query);

     catch (Exception ex) 
        System.out.println("Error: " + ex);
    

    return rs;


//end of class

我在 JForm 中这样称呼它..

SQLConnect connect;

public Class()
   connect = new SQLConnect();


public void methodThatGetsCalledALot(String current_id)
    connect.reconnect(); //refer to SQLConnectClass displayed above
    ResultSet member = connect.getMemberViaMemberId(current_id);
    try
        if (member.next()) 
            lastName = member.getString("last_name");
            firstName = member.getString("first_name");
        

        //display data...
     catch (SQLException ex)
    

代码:

connect.reconnect();
ResultSet rs = connect.callSQLMethod();

是最重要的部分,每个类和每个需要获取数据的方法都会调用它。我必须承认,我从不费心关闭 ResultSet,因为它经常在循环中并且无论如何都会被新数据替换。

同样,我的问题是:由于连接太多,我无法继续获取数据。我真的正确地关闭了东西还是我错过了一些东西?对于如何解决这个问题,有任何的建议吗?如果我的问题太令人困惑,如果需要,我会添加更多详细信息。谢谢你。如果有人热衷于免费帮助我,我会去发一些电子邮件。谢谢!顺便说一句,新年快乐。

【问题讨论】:

你关闭连接太频繁了! 这不是一个好的设计,如果某些结果集很大并且您需要另一个“callSQLMethod”会发生什么? 好吧,我的原因可能是捕获异常,这些异常表明我无法对结果集执行任何操作,因为连接已关闭。因此,为什么我称之为重新连接方法。 使用一些connection pool怎么样? " 我在尝试以好的方式解决问题时运气不佳,糟糕的设计总是涵盖" -- 实际上,不。这意味着您还没有理解“好方法”并且执行不正确。通过学习和正确实施“好方法”而不是对它进行破解并尝试随机的事情直到它似乎有效,然后以新的意想不到的方式中断,你会得到更好的服务。 【参考方案1】:

您似乎正在创建大量连接并在 ResultSet 打开的情况下进行递归。不要一直创建新连接,您只需要一个连接,不要一直重新连接。您实际上根本不需要 reconnect 方法(除非您的连接自动关闭,在这种情况下,您可以在执行查询之前检查它是否已关闭)。完成检索值后,您需要关闭 ResultSet。

您需要的只是数据而不是结果集。所以获取数据并释放资源,即ResultSet。所以这样做 -

在您的getMemberViaMemberId 中不要返回ResultSet,在该方法本身中,遍历结果集并为该行创建对象并将其存储到集合中并在关闭结果集后返回该集合。并且根本不要调用reconnect 方法。

关闭退出程序时的单一连接。

【讨论】:

您的回答看起来不错,因为它有点消除了我对如何重新编码它的困惑,一旦我实现了这个,我会回复你。但是您确实做对了一件事情,连接确实会自动关闭,并且我收到一个错误,提示连接关闭后无法执行任何操作。这就是为什么我因为那个错误而创建了重新连接,并且在我重新创建连接之前附加了 con.close() 以确保它确实已关闭..

以上是关于JDBC连接太多错误的主要内容,如果未能解决你的问题,请参考以下文章

java jdbc中的连接太多

JAVA:MySql:连接太多

Tomcat 池不重置池。获得太多连接错误

数据源拒绝建立连接,来自服务器的消息:“连接太多”

Spring Boot 连接 Oracle 数据库时出错:无法打开 JDBC 连接以执行 DDL

JDBC 连接失败,错误:与主机的 TCP/IP 连接失败