#java #mysql #performance #jdbc #connection
#java #mysql #Производительность #jdbc #подключение
Вопрос:
Приветствую, у меня некоторые проблемы с JDBC, он настолько медленный, что в него невозможно поверить.
Тот же код отлично работает с подключением Windows к удаленной базе данных.
Но с slackware для подключения требуется около 30 секунд, и первая попытка всегда завершается неудачей. Мне пришлось обойти его, чтобы повторить попытку, чтобы убедиться, что он подключается. Но даже это не должно быть таким медленным.
кажется, что использование команды mysql в bash подключается мгновенно.
Вот код, используемый для создания базы данных
public static Object createDBConnection(String dbType, String host, String hostPort, String dbName, String userName, String password) {
String connectionString = buildConnectionString(dbType, host, hostPort, dbName, userName, password);
Connection connection = null;
try {
if(dbType.equals(K_dbTypeMySQL)){
Class.forName("com.mysql.jdbc.Driver");
}else if(dbType.equals(K_dbTypeSqlServer)){
Class.forName("net.sourceforge.jtds.jdbc.Driver");
}else if(dbType.equals(K_dbTypeSqlServerExpress)){
Class.forName("net.sourceforge.jtds.jdbc.Driver");
}else if(dbType.equals(K_dbTypePostgres)) {
Class.forName("org.postgresql.Driver");
}
connection = DriverManager.getConnection(connectionString);
return connection;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
public static String buildConnectionString(String dbType, String host, String hostPort, String dbName, String userName, String password){
String connectionString = null;
if((dbType.equals(K_dbTypeMySQL))){
connectionString = "jdbc:mysql://" host ":" hostPort "/" dbName "?user=" userName "amp;password=" password;
}else if((dbType.equals(K_dbTypeSqlServer)))
connectionString = "jdbc:jtds:sqlserver://" host ":" hostPort ";databaseName=" dbName ";selectMethod=cursor;user=" userName ";password=" password;
else if((dbType.equals(K_dbTypeSqlServerExpress)))
connectionString = "jdbc:jtds:sqlserver://" host ":" hostPort ";databaseName=" dbName ";selectMethod=cursor;user=" userName ";password=" password;
else if(dbType.equals(K_dbTypePostgres))
connectionString = String.format("jdbc:postgresql://%s:%s/%s?user=%samp;password=%s",host,hostPort,dbName,userName,password);
return connectionString;
}
Я пытался использовать разные драйверы, но то же самое, первая попытка всегда занимает целую вечность для подключения (20 секунд), второй раз занимает около 2 секунд.
У меня такая же проблема при попытке открыть URL-адрес https с помощью URLConnection в первый раз всегда терпит неудачу, во второй раз проблем нет.
У кого-нибудь есть представление об этой проблеме? Поскольку у меня проблема с открытием URL-адреса HTTPS с помощью java, может быть, какая-то проблема с SSL? использует ли mysql SSL каким-либо образом?
версия сервера: 5.1.41
хост: localhost
драйвер jdbc: 5.1.8, 5.1.12, 5.1.17 (у всех одинаковые проблемы)
сборка java: root @LinuxMZ: ~/nx_dev/sicm# java -версия версия java «1.6.0_06» Java (TM) SE Среда выполнения (сборка 1.6.0_06-b02) Клиентская виртуальная машина Java HotSpot (TM) (сборка 10.0-b22, смешанный режим, совместное использование)
// EDIT 127.0.0.1 и localhost решают ту же проблему
спасибо за вашу помощь
Пока ничего, DBManager.createConnection зависает на 20 секунд. Я попытался подключиться с другого компьютера, и он работает безупречно.
Комментарии:
1. Вы пробовали профилирование с помощью VisualVM, чтобы увидеть, показывает ли оно очевидное замедление?
2. Нет, я этого не делал, к сожалению, это встроенный компьютер, и у меня нет никакого графического интерфейса, кроме ssh. оконный менеджер не установлен
3. Если он запускает Sun JDK, вы все равно можете запускать VisualVM удаленно, включив JMX. Если вы не можете получить прямой доступ к портам JMX, выполните переадресацию портов по ssh.
Ответ №1:
30 секунд пахнут как тайм-аут DNS при поиске указанного вами имени.
Вы можете подтвердить это, используя вместо этого IP-адрес в качестве имени хоста.
Комментарии:
1. Спасибо за ваш ответ, но 127.0.0.1 и localhost решают ту же проблему
2. @user977194: не имеет значения. MySQL будет только когда-либо видеть, что соединение поступает с IP-адреса, и попытается выполнить обратный DNS-поиск по нему — может быть user@example.com вместо того , чтобы user@192.168.1.1 в таблице пользователей. Он ДОЛЖЕН проверять это, поэтому всегда будет выполняться обратный поиск.
Ответ №2:
Похоже, MySQL пытается разрешить проблему с клиентом с помощью nslookup. В текущем контексте у клиента есть 127.0.0.1 или 192.168.1.XXX. Я думаю, это из-за неправильного именования в /etc/hosts. Посмотрите в этом файле, нет ли плохой записи!