2011-04-06 113 views
1

我试图启动一个hsqldb的嵌入式版本,并且它可以很好地与包含的工具一起工作,它们不会很慢或者其他任何东西。hsqldb极其缓慢的SELECT * FROM [table]

但是,当我尝试使用下面的代码获取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(); 

在该被印刷在控制台日志,它显示了查询倍

[编辑] 继承人日志

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

的问题是在第一条目位于正在使用该数据的servlet中,现在已解决

回答

2

这里有些事情没有了。我不认为你给我们提供了所有我们需要的代码来识别问题。

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

在日志中添加其他条目并通过执行跟踪您的程序。找出它在何处以及为什么会循环27次。你给我们提供的信息没有表明这一点。

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

+0

这是为什么我很困惑自己的确切原因。这是一个非常简单的例子,我试图从官方文档中学习。我已更正帖子以指示其一个表格和20行 – 2011-04-06 12:01:19

+0

在执行前后放置日志记录,并在每个日志中输出当前时间,以便您可以看到延迟的位置。用这种方式跟踪代码,找出需要这么久的代码。 – 2011-04-06 12:04:52

+0

根据您提供的信息,问题的最可能原因是您提供的代码之外的某个循环。你如何初始化这段代码?它坐在哪里?它是在一个线程?你在哪里开始线程?某处你做了27次导致这段代码被执行的东西。顺便问一下,它总是27次? – 2011-04-06 12:09:02

1

关于显示查询27次这很奇怪;你确定没有办法多次调用这段代码吗?

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

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

这是一个伟大的建议。这不会导致问题,但内存分配会更好。 – 2011-04-06 12:05:29