Java MySQL получает последнюю строку

#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. Просто слишком много обслуживания, метод Алексея работает нормально