常规servlet性能
那么这种servlet执行的效果如何呢?我们用JMeter来测试一下。使用JMeter模拟50个并发用户,他们将在5分钟内访问servlet6次。
为了使Tomcat在大访问量下正常工作,我必须修改Tomcat的配置文件server.xml,修改连接数据参数为簃axProcessors="150",acceptCount="150"
图1是JMeter结果图的快照,显示了测试的性能结果。

Figure 1. Conventional servlet performance. Click on thumbnail to view full-sized image.
结果很明显:平均每次请求执行的时间为2.2秒(当然,如果我们使用预编译语句和连接池的话结果会更好一些)。而在我只模拟一个用户时,执行时间仅为70毫秒。因此,我们可以确定在常规servlet方式中大访问量将导致性能的明显下降。
Train模式的实现
类推我们的铁路站点,让我们在servlet中尝试一下相同的感觉。如果用户的请求必须等待一次有计划的与数据库的交互而且依赖其他的请求时会怎么样?这种功能很容易用JDBC2.0代码来实现:
statement.addBatch(); //Load the first passenger
statement.addBatch(); // Load the second passenger
…
statement.executeBatch(); //Train is departing
这段代码是一种常用的用来减少与数据交互次数的技巧。
一种更有效的方式是组合多个SQL语句成一个,这样就可以不仅减少与数据库交互的次数而且减少查询的次数。例如,两个不同的select语句select * from trentry where id=333 和 select * from trentry where id=266可以用select * from trentry where id in (333,266)来代替。这样的话,更多的用户请求可以用一次事务范围内的一个SQL语句来完成。
此外,随着性能的提高,体现了另一个好处:这种技术减少了死锁和超时!更少的数据库连接,更少的排他锁,更少的死锁和超时。
有时候是不可能将多个SQL语句组合成一个(如一个普通的更新语句)。那我们就必须使用statement.addBatch()方法。
Train方式组合了这两种方法。
