我从数据库中收到此错误
数据源拒绝建立连接,来自的消息 服务器:"连接太多"
我正在关闭我的连接,当我的线程池只有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();
}
}
}
答案 0 :(得分:2)
代码的主要问题是在调用MyClass构造函数时在主线程中打开连接,但只有在线程池完成任务后才关闭连接。因此,您尝试打开5697个连接,这是很多。并且这些连接等待关闭,池中的5个线程中的一个已完成任务。
正如我在评论中所说:打开连接的方法应该是关闭它的方法。并且它应该在finally块中关闭以确保它已关闭,无论方法中发生什么,或者更好,您应该使用try-with-resources statement来确保