我的代码出了什么问题数据源拒绝建立连接,来自服务器的消息:“连接太多”

时间:2014-10-18 13:29:22

标签: java mysql

我从数据库中收到此错误

  

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

我正在关闭我的连接,当我的线程池只有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();
        }
    }

}

1 个答案:

答案 0 :(得分:2)

代码的主要问题是在调用MyClass构造函数时在主线程中打开连接,但只有在线程池完成任务后才关闭连接。因此,您尝试打开5697个连接,这是很多。并且这些连接等待关闭,池中的5个线程中的一个已完成任务。

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