Java MySQL получить последнюю строку - PullRequest
0 голосов
/ 25 октября 2011

Итак, у меня проблемы с моей программой. По сути, эта программа похожа на чат на базе 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 секунд?

Ответы [ 4 ]

2 голосов
/ 25 октября 2011

Попробуйте, и вы удивитесь:)

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 голос
/ 25 октября 2011

Как насчет ведения списка, добавить новое сообщение в этот список при сохранении его в базу данных и просто прочитать новые сообщения из этого списка и очистить его в конце readChat ()?

1 голос
/ 25 октября 2011

Вы все еще просматриваете все результаты.Если у вас есть какой-то способ сохранить время отправки сообщений, например, создать столбец времени, вы можете попытаться сократить количество возвращаемых результатов, выполнив

ResultSet res = st.executeQuery("SELECT * FROM  table1 WHERE id = ? AND time > ?");

где первое?это идентификатор пользователя и 2-го?время последнего прочитанного сообщения.Это основано на предположении, что идентификатор является уникальным идентификатором пользователя.

1 голос
/ 25 октября 2011

вы можете просто прочитать необходимые строки, в настоящее время вы читаете все строки, попробуйте выполнить следующее,

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...