JDBC с MySQL очень медленный, не знаю почему - PullRequest
4 голосов
/ 30 июня 2009

У меня проблема с очень медленным соединением между моим кодом Java и базой данных MySQL. Я не знаю, где находится горлышко бутылки.

Моя программа более или менее чатбот. Пользователь вводит что-то, моя программа разбивает предложение на слова и отправляет это слово за словом в базу данных. Если он что-то там находит, пользователь получает вывод. База данных находится на внешнем сервере, но я также попытался подключиться к ПК рядом со мной. Оба медленно.

Я попробовал соединение один раз в другом месте, где я обычно работаю, и там это было быстро, большую часть времени.

Мой код SQL:

ВЫБРАТЬ инфо. ИНФОРМАЦИЯ ИЗ ИНФОРМАЦИИ инфо, INFO_SCHLUESSEL sch
WHERE LCASE (sch.SCHLUESSELWORT) LIKE '"+ input +"%' AND info.ID_INFO = sch.ID_INFO
Заказать по info.PRIORITAET DESC LIMIT 1;

(только что вспомнил, если это помогает понять код sql:
schluessel = ключ
Schluesselwort = ключевое слово
приоритет = приоритет)

Мой код базы данных Java - более или менее стандартный материал:

String driver = "com.mysql.jdbc.Driver";
String dbase = "jdbc: mysql: // bla";
String dbuser = "bla";
String dbpw = "bla";

Class.forName (драйвер);
Соединение con = DriverManager.getConnection (dbase, dbuser, dbpw);
Оператор stmt = con.createStatement ();

ResultSet rs = stmt.executeQuery (запрос);
while (rs.next ())
{
ergebnis = rs.getString ("info.INFORMATION");
}

* +1037 * rs.Close ();

stmt.close ();
con.close ();

редактировать:

Я уже некоторое время пробовал этот DBCP, и я не могу заставить его работать. Кажется, это так же медленно, как старое соединение. Вот пример, предоставленный веб-сайтом, которым я пользуюсь:

GenericObjectPool connectionPool = new GenericObjectPool (null);
ConnectionFactory connectionFactory = новый DriverManagerConnectionFactory ("jdbc: mysql: // bla", "bla", "bla");
PoolableConnectionFactory poolableConnectionFactory = новый PoolableConnectionFactory (connectionFactory, connectionPool, null, null, false, true);
Драйвер PoolingDriver = новый PoolingDriver ();
driver.registerPool ( "пример", connectionPool); * * тысяча пятьдесят-дв Соединение conn = DriverManager.getConnection ("jdbc: apache: commons: dbcp: example");

Ответы [ 2 ]

6 голосов
/ 30 июня 2009

Я подозреваю, что проблема связана с настройкой соединения. Стоит рассчитать, сколько времени это займет:

Connection con = DriverManager.getConnection(dbase, dbuser, dbpw);

и, если да, проверьте Apache Commons DBCP , который позволяет объединять соединения с базой данных.

0 голосов
/ 30 июня 2009

Ну, я думаю, это требует обсуждения дизайна. Есть несколько вещей, которые вы можете сделать, чтобы улучшить производительность. Поскольку здесь вы ничего не сохраняете, лучше предварительно загрузить все данные в памяти в некоторый пользовательский объект Java, карту, список или что-то еще, а затем выполнить поиск слова в памяти и получить результаты. Другим подходом может быть использование пакетного оператора, чтобы вы не создавали и не освобождали соединения для каждого слова. Да, и если вы используете операторы пакетной обработки, убедитесь, что вы установили размер пакета на соответствующее число, предпочтительно простое число

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...