【问题标题】:What's wrong with my code Data source rejected establishment of connection, message from server: "Too many connections"我的代码有什么问题数据源拒绝建立连接,来自服务器的消息:“连接太多”
【发布时间】:2014-10-18 13:29:21
【问题描述】:

我从数据库中收到此错误

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

我正在正确关闭我的连接,我不知道为什么当我的线程池只有 5 个并且我认为我正在关闭连接时出现此错误。任何人都知道为什么。

下面是我的代码。我改变了一些东西以保持匿名

public class myMain {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < (569743 / 100); i++) {
            try {
                MyClass mclass = new MyClass();
                executor.execute(mclass);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        executor.shutdown();
        try {
            executor.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Finished all threads");
    }

}

.

public class MyClass implements Runnable {

    public MyClass(){
        Class.forName("com.mysql.jdbc.Driver");
        connect = DriverManager.getConnection("jdbc:mysql://localhost/mytable?" + "user=&password=");
    }

    public  void run() {
        try {
            String sql = "My select STATEMENT";
            PreparedStatement stmt = connect.prepareStatement(sql);

            ResultSet rs = stmt.executeQuery(sql);
            while (rs.next()) {
                try {

                    int id = rs.getInt("movie_id");
                    String title = rs.getString("title");
                    int year = rs.getInt("year");
                    String trailerUrl = rs.getString("trailerUrl");
                    if (trailerUrl == null || (trailerUrl != null && trailerUrl.length() == 0)) {
                        YoutubeTrailerFetcher youtube = new YoutubeTrailerFetcher(title, year);
                        String trailer = youtube.getVideoId();

                        String updateSql = "my UPDATE Statement";
                        Statement updateStm = connect.createStatement();
                        updateStm.executeUpdate(updateSql);
                        updateStm.close();

                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
            connect.close();
            stmt.close();
            rs.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

}

【问题讨论】:

  • 这个ResultSet rs = stmt.executeQuery(sql);应该像ResultSet rs = stmt.executeQuery();
  • 连接可能来自另一个应用程序。顺便说一句,不,您没有正确关闭连接。打开连接的方法应该是关闭它的方法。并且它应该在 finally 块中关闭以确保它已关闭,无论方法中发生什么,或者更好的是,您应该使用try-with-resources statement 来确保它。

标签: java mysql


【解决方案1】:

您的代码的主要问题是您在调用 MyClass 构造函数时在主线程中打开了一个连接,但只有在线程池完成执行任务后才关闭该连接。所以你正在尝试打开 5697 个连接,这非常多。这些连接等待池中的 5 个线程之一完成执行任务后关闭。

正如我在评论中所说:打开连接的方法应该是关闭它的方法。并且它应该在 finally 块中关闭以确保它被关闭,无论方法中发生什么,或者更好,您应该使用try-with-resources statement 来确保

【讨论】:

    猜你喜欢
    • 2012-08-18
    • 2011-08-12
    • 2015-04-03
    • 2014-05-01
    • 2011-03-13
    • 2016-10-28
    • 1970-01-01
    • 2010-10-30
    相关资源
    最近更新 更多