使用SELECT * FROM [table]时hsqldb非常慢

时间:2011-04-06 11:53:01

标签: java hsqldb

我正在尝试启动hsqldb的嵌入式版本,它可以正常使用包含的工具,它们不会很慢或任何东西。

但是当我尝试使用以下代码获得20行时,在打印所有结果之前最多需要10秒

Class.forName("org.hsqldb.jdbcDriver");
Connection conn = DriverManager.getConnection("jdbc:hsqldb:hsql://127.0.0.1/woopwoop", "SA", "");

Statement st = conn.createStatement(); 

ResultSet rs = st.executeQuery("SELECT * FROM ttris_users");

while(rs.next())
{
    output += "<tr>";

    output += "<td>" + rs.getString("id") + "</td>";
    output += "<td>" + rs.getString("name") + "</td>";
    output += "<td>" + rs.getString("password") + "</td>";
    output += "<td>" + rs.getString("email") + "</td>";
    //name, password, email

    output += "</tr>";
}

我以一种非常简单的方式初始化服务器,这可能就是为什么它运行缓慢,我该如何优化呢?

org.hsqldb.server.Server server = new org.hsqldb.server.Server();
server.setDatabaseName(1, "woopwoop");
server.setDatabasePath(1, "C:\\ttris\\db\\");
server.start();

在控制台中打印的日志中,它会显示查询 27

[编辑] 下面是日志中的第一个条目

[Server@1050e1f]: [Thread[HSQLDB Server @1050e1f,5,main]]: handleConnection(Socket[addr=/127.0.0.1,port=37523,localport=9001]) entered
[Server@1050e1f]: [Thread[HSQLDB Server @1050e1f,5,main]]: handleConnection() exited
[Server@1050e1f]: [Thread[HSQLDB Connection @3e0ebb,5,HSQLDB Connections @1050e1f]]: 0:Trying to connect user 'SA' to DB (woopwoop)
[Server@1050e1f]: [Thread[HSQLDB Connection @3e0ebb,5,HSQLDB Connections @1050e1f]]: 0:Connected user 'SA'
[Server@1050e1f]: 0:SELECT * FROM ttris_users
[Server@1050e1f]: [Thread[HSQLDB Server @1050e1f,5,main]]: handleConnection(Socket[addr=/127.0.0.1,port=37524,localport=9001]) entered
[Server@1050e1f]: [Thread[HSQLDB Server @1050e1f,5,main]]: handleConnection() exited
[Server@1050e1f]: [Thread[HSQLDB Connection @76fba0,5,HSQLDB Connections @1050e1f]]: 1:Trying to connect user 'SA' to DB (woopwoop)
[Server@1050e1f]: [Thread[HSQLDB Connection @76fba0,5,HSQLDB Connections @1050e1f]]: 1:Connected user 'SA'
[Server@1050e1f]: 1:SELECT * FROM ttris_users
[Server@1050e1f]: [Thread[HSQLDB Server @1050e1f,5,main]]: handleConnection(Socket[addr=/127.0.0.1,port=37525,localport=9001]) entered
[Server@1050e1f]: [Thread[HSQLDB Server @1050e1f,5,main]]: handleConnection() exited
[Server@1050e1f]: [Thread[HSQLDB Connection @16dadf9,5,HSQLDB Connections @1050e1f]]: 2:Trying to connect user 'SA' to DB (woopwoop)
[Server@1050e1f]: [Thread[HSQLDB Connection @16dadf9,5,HSQLDB Connections @1050e1f]]: 2:Connected user 'SA'
[Server@1050e1f]: 2:SELECT * FROM ttris_users

该问题位于正在使用数据的servlet中,现在已解决

2 个答案:

答案 0 :(得分:2)

这里有些东西。我不认为你给我们提供了识别问题所需的所有代码。

如果您的日志显示查询执行了27次,那么这就是问题所在。找出为什么。您粘贴的代码不包含会导致此问题的循环。因此,我必须假设导致此问题的代码被排除在您提供给我们的示例之外。

在日志中添加其他条目,并通过执行跟踪您的程序。找出它循环27次的地点和原因。您提供给我们的信息没有显示出这一点。

另外,您说您使用此代码获得20个表。你的意思是20个记录/行?我只看到一个表中的查询:ttris_users

答案 1 :(得分:1)

将查询显示27次非常奇怪;你确定这个代码不能被多次调用吗?

关于加快速度:将会有一个很多的字符串复制,以至于它会对性能产生重大影响。考虑使用StringBuilder和append()调用:

output.append("<td>").append(rs.getString("id")).append("</td>");