Java MySQL获取最后一行

时间:2011-10-25 03:32:49

标签: java mysql chat

所以我的程序出了问题。基本上这个程序就像基于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();
    }
}

我不确定如何提高效率。执行它需要太长时间。如果id为23,我甚至看不到消息,因为它需要超过5秒。我添加了

if (lastLine < res.getInt("id"))

lastLine = res.getInt("id");

我努力使它只读取新消息,但它没有按预期工作。我认为它仍然是逐行执行的,只是没有在聊天中显示它。必须有一个更简单的方法。

编辑:好的,所以我修复了没有看到消息的问题,(我忘了删除每隔5秒清除聊天的部分代码)。但是发送消息还需要很长时间,大约3-4秒?

4 个答案:

答案 0 :(得分:2)

试试这个,你会想知道:)

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 :(得分:1)

你可以只读取所需的行,目前你正在阅读所有尝试过的行,

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();
    }
}

答案 2 :(得分:1)

您仍然会遍历所有结果。如果你有一些方法来存储发送消息的时间,即创建一个时间列,你可以尝试通过这样做来缩短返回的结果数

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

第一个?是用户的ID和第二个?是最后一条读取消息的时间。这是基于假设id是一些唯一的用户ID。

答案 3 :(得分:1)

如果要保存列表,在将新邮件保存到数据库时向该列表添加新邮件,只读取该列表中的新邮件并在readChat()结束时将其清除,该怎么办?