Итак, я нашел решение. Я не упомянул имя порта в 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;
}
Надеюсь, это поможет.
org.apache.commons.dbcp.SQLNestedException: невозможно создать PoolableConnectionFactory (источник данных отклонил установление соединения, сообщение от сервера: «Слишком много соединений»)
Это означает, что что-то пропускает соединения . Т.е. что-то продолжает получать (открывать) соединения, даже не закрывая их и / или не возвращаясь в пул соединений. Перезапуск БД, чтобы он мог жестко закрыть все открытые соединения, должен временно решить проблему. Исправление чего-то , чтобы он правильно закрывал соединение после использования, должно навсегда решить проблему.
Хотя опубликованный код JDBC не следует оптимальной идиоме, он не выглядит причиной утечки соединений. Вероятно, БД уже работает часами / днями, и во время предыдущих тестов вы приобрели слишком много соединений, не закрывая их, так что БД исчерпывает их.