#java #mysql #chat
#java #mysql #Чат
Вопрос:
Итак, у меня возникли проблемы с моей программой. По сути, пока программа похожа на чат на основе MySQL. Он сохраняет сообщения в базе данных и считывает их. У меня проблемы с чтением. То, что он делает прямо сейчас, — это когда-либо за 5 секунд перечитывать все сообщения в базе данных. Я пытался заставить его читать только новые сообщения, но это работает не слишком хорошо. Это мой код:
public static void readChat()
{
try
{
MySQL.sqlConnect();
try
{
Statement st = con.createStatement();
ResultSet res = st.executeQuery("SELECT * FROM table1");
while (res.next())
{
if (lastLine < res.getInt("id"))
{
String message = res.getString("message");
Gui.out.append(message "n");
lastLine = res.getInt("id");
}
}
}
catch (SQLException s)
{
System.out.println("SQL code does not execute.");
}
MySQL.sqlDisconnect();
}
catch (Exception e)
{
e.printStackTrace();
}
}
Я не уверен, как сделать это эффективным. Для выполнения этого требуется слишком много времени. Если идентификатор равен 23, я даже не вижу появления сообщений, потому что это занимает больше 5 секунд. Я добавил
if (lastLine < res.getInt("id"))
и
lastLine = res.getInt("id");
я пытался заставить его читать только новые сообщения, но это сработало не так, как ожидалось. Я думаю, что он все еще выполняется построчно, просто не показывает это в чате. Должен быть более простой способ.
РЕДАКТИРОВАТЬ: Хорошо, итак, я исправил проблему с отсутствием сообщений (я забыл удалить часть кода, которая очищала чат каждые 5 секунд). Но отправка сообщений по-прежнему занимает много времени, около 3-4 секунд?
Ответ №1:
Попробуйте это, и вы удивитесь 🙂
ResultSet res = st.executeQuery("SELECT * FROM table1 where id > " lastLine);
instad
ResultSet res = st.executeQuery("SELECT * FROM table1");
и получает результат без if
while (res.next())
{
String message = res.getString("message");
Gui.out.append(message "n");
lastLine = res.getInt("id");
}
Конечно, убедитесь, что индекс в поле id
Комментарии:
1. Это решение может означать, что вам не хватает обновлений от разных транзакций.
Ответ №2:
вы можете просто прочитать требуемые строки, в настоящее время вы читаете все строки, попробуйте выполнить следующее,
public static void readChat()
{
try
{
MySQL.sqlConnect();
try
{
Statement st = con.Preparestatment("SELECT * FROM table1 where id > ?");
st.setInt(0,lastLine);
ResultSet res = st.executeQuery();
while (res.next())
{
String message = res.getString("message");
Gui.out.append(message "n");
lastLine = res.getInt("id");
}
}
catch (SQLException s)
{
System.out.println("SQL code does not execute.");
}
MySQL.sqlDisconnect();
}
catch (Exception e)
{
e.printStackTrace();
}
}
Комментарии:
1. Да, что-то похожее на метод Алексея. Я просто немного медленный.
Ответ №3:
Вы все равно перебираете все результаты. Если у вас есть какой-либо способ сохранить время, в которое отправляются сообщения, т.е. Создать столбец времени, вы можете попытаться сократить количество возвращаемых результатов, выполнив
ResultSet res = st.executeQuery("SELECT * FROM table1 WHERE id = ? AND time > ?");
где первая? является ли идентификатор пользователя и 2-й? это время последнего прочитанного сообщения. Это основано на предположении, что идентификатор является некоторым уникальным идентификатором пользователя.
Комментарии:
1. Я думаю, что то, как это сделал Алексей, имеет больше смысла. Я был на правильном пути, я просто заставил его перебирать все сообщения вместо тех, которые мне нужны.
Ответ №4:
Как насчет ведения списка, добавления нового сообщения в этот список при сохранении его в базе данных и просто чтения новых сообщений из этого списка и очистки его в конце readChat()?
Комментарии:
1. Просто слишком много обслуживания, метод Алексея работает нормально