Источник данных отклонил установление соединения, сообщения с сервера: “Слишком много соединений”, [закрытых]

9
задан Community 23 May 2017 в 12:01
поделиться

2 ответа

Итак, я нашел решение. Я не упомянул имя порта в URL-адресе подключения к базе данных.

String url = "jdbc:mysql://" + server_name +  "/" + database;

Вероятно, поэтому это привело к множеству утечек соединений. Сделав это, я попробовал использовать приведенный здесь пример. Теперь он не вызывает никаких ошибок. Спасибо BalusC, как я понял это только благодаря его комментарию об изменении номера порта в MySQL. Чтобы добавить, способ изменить номер порта MySQL - НЕ путем изменения файла my.ini, а путем запуска мастера конфигурации экземпляра MySQL в меню Пуск -> Программы -> MySQL Server 5.1 -> Конфигурация экземпляра сервера MySQL Волшебник. Также было интересно отметить, что код не выдавал никаких ошибок, если номер порта не был указан, и программа работала без сбоев. Вероятно, JDBC по умолчанию подключается к 3306. Если у кого-то есть какое-то конкретное представление о том же, поделитесь, пожалуйста.

Вот исходный код:

DBUtils.java

package DB;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.commons.dbcp.BasicDataSource;
import com.mysql.jdbc.Driver;

/**
 * @author decorrea
 *
 */
public class DBUtils {

    public static String jdbc_driver_name = "com.mysql.jdbc.Driver";    

    private static String server_name ;
    private static String database;
    private static String username;
    private static String password;

    private static int maxActive = 20;
    private static int maxIdle = 2 ; 

    public String getServer_name() {
        return server_name;
    }

    public void setServer_name(String serverName) {
        server_name = serverName;
    }

    public String getDatabase() {
        return database;
    }

    public void setDatabase(String database) {
        this.database = database;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }


    public static DataSource getDataSource(String server_name, String database, String username, String password){

        BasicDataSource datasource = new BasicDataSource();
        datasource.setDriverClassName(jdbc_driver_name);
        String url = "jdbc:mysql://" + server_name +  "/" + database;
        System.out.println(url);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setUrl(url);
        datasource.setMaxActive(maxActive);
        datasource.setMaxIdle(maxIdle);
        return datasource;
    }
}

TwitterAPI.java

public class TwitterAPI {

    private static String server_name = "localhost:7777";
    private static String twitter_databse = "twitter";
    private static String username = "root";
    private static String password = "password";
    public static String twitter_unique_usernames_file = "twitter_unique_usernames_file.txt";
    public static String language_model_file = "C:\\de\\JARS\\lingpipe-4.0.0\\demos\\models\\langid-leipzig.classifier";
    public static DataSource dataSource = DBUtils.getDataSource(server_name, twitter_databse, username, password);

    public static Connection startDBConnection(String server_name, String database, String username, String password) {
        //Set DB parameters
        //DBUtils mysql_obj = setDBParams(server_name, database, username, password);               

        Connection connection = null;
        //connection = mysql_obj.createConnection();
        try {
            connection = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    public static DBUtils setDBParams(String server_name, String database, String username, String password){

        DBUtils mysql_obj = new DBUtils();
        mysql_obj.setServer_name(server_name);
        mysql_obj.setDatabase(database);
        mysql_obj.setUsername(username);
        mysql_obj.setPassword(password);
        return mysql_obj;
    }

    public static String getTweets(BigInteger id){

        Connection connection = startDBConnection(server_name,twitter_databse,username,password);       
        ResultSet resultSet = null;     
        String tweet = new String();
        try {           
            Statement statement = connection.createStatement();
            String query = SQL_queries.get_tweets_on_id  + id.toString();

            //Execute the query
            resultSet = statement.executeQuery(query);          

            while(resultSet.next()){
                tweet = resultSet.getString("content");
            }
            resultSet.close();
            statement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        finally{
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return tweet;
    }

Надеюсь, это поможет.

3
ответ дан 4 December 2019 в 22:27
поделиться

org.apache.commons.dbcp.SQLNestedException: невозможно создать PoolableConnectionFactory (источник данных отклонил установление соединения, сообщение от сервера: «Слишком много соединений»)

Это означает, что что-то пропускает соединения . Т.е. что-то продолжает получать (открывать) соединения, даже не закрывая их и / или не возвращаясь в пул соединений. Перезапуск БД, чтобы он мог жестко закрыть все открытые соединения, должен временно решить проблему. Исправление чего-то , чтобы он правильно закрывал соединение после использования, должно навсегда решить проблему.

Хотя опубликованный код JDBC не следует оптимальной идиоме, он не выглядит причиной утечки соединений. Вероятно, БД уже работает часами / днями, и во время предыдущих тестов вы приобрели слишком много соединений, не закрывая их, так что БД исчерпывает их.

5
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: