所以我的程序出了问题。基本上这个程序就像基于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秒?答案 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()结束时将其清除,该怎么办?