优化Derby数据库技巧.doc
文本预览下载声明
优化Derby数据库技巧
数据库在操作少量测试数据和大量数据的时候,表现行为上有很大的差异。通常,在开发过程前期,人们不会关注数据库性能的问题,但是随着时间的发展,人们必须采取一些措施来保证数据库在大量数据的情况下正常工作。
Derby这个完全Java开发的开源的数据库也不例外,因此你必须保证它不会成为 你程序的一个瓶颈。尽管人们可以在Derby的手册中找到关于这个话题全面的资料,我还是想更详尽的关注一下这些问题,基于我的经验提供一些具体的例子。 本文将着重于那些由在大的数据表中选择查询数据而产生的程序性能问题。
首先,有很多关于调整Derby属性(诸如页面大小和缓存大小等)的技巧。修改这些参数可以在一定程度上调整数据库的性能,但是在通常情况下,更主要的问题来自与你的程序和数据库的设计,因此,我们必须首先关注这些问题,最后再来考虑Derby的属性。
在接下来的段落里,我将介绍一些能够优化程序中有问题部分的技术。但是,和其他性能优化操作一样,我们需要在优化前先测量并确认问题所在。
一个简单的例子
让我们从一个简单的例子开始:假设我们Web程序中拥有一个 “search/list”的页面,要处理一个有接近100,000行的表,并且那个表不是很小的(至少有10栏)。用简单的JDBC来写一个例子,这样 我们可以专注在数据库和JDBC问题上来。这篇文章中介绍的所有准则对所有的面向对象的映射工具都适用。
为了使得用户能够列出一个大的表,通常使用下面简单的查询语句。
select * from tbl对应的JDBC语句如下:
Class.forName(org.apache.derby.jdbc.ClientDriver).newInstance();
Connection connection =
DriverManager.getConnection
(jdbc:derby://localhost:1527/testDb;);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(select * from tbl);
ArrayList allResults = new ArrayList();
while (rs.next()) {// Object-Relation mapping code to
populate your// object from result
set rowDomainObject domainObject =
populate(rs);allResults.add(modelObject);}
System.out.println(Results Size:
+ allResults.size());在这儿,我们碰到了第一个问题。执行这样的代码,并产生100,000(或更多)个 domain对象将肯定???导致java用完堆栈空间,产生一个“java.lang.OutOfMemoryError”的错误。对于初学者来说,我们首 先必须找到一个方法来使得这个程序工作。
分页Result Sets
随着程序中数据量的增多,你首先想到的应该做的事就是为特定的记录(通常是视图)提供分页支持。正如你在这个介绍性的例子中看到的,简单地去获取庞大的result sets很容易导致 out of memory的错误。
许多数据库服务器支持特定的SQL结构,它们可以用于获得一个查询结果的特定的子集。例如,在MySQL中,提供了LIMIT和OFFSET关键字,它们可以用于select查询。因此,如果你执行类似下面的查询:
select * from tbl LIMIT 50 OFFSET 100你的结果集将包含从第100个结果开始的50行,即使原先的查询返回了100, 000行。许多其他的数据库提供商通过不同的结构提供了相似的功能。不幸的是,Derby并没有提供这样的功能,所以你必须继续使用原先的“select * from tbl”查询语句,然后在应用程序中实现一个分页的机制。让我们来看下面的例子:
Class.forName(org.apache.derby.jdbc.ClientDriver)
.newInstance();Connection
connection = DriverManager.getConnection
(jdbc:derby://localhost:1527/testDb;);
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(SE
显示全部