在實際的項目中,至少有2種類型的JDBC請求需要關注:select語句和存儲過程。前者反應了select語句是否高效,以及表的索引等是否需要優(yōu)化;后者則是反應存儲過程的算法是否高效。它們如果效率低下,必然會帶來響應上的不盡如人意。對于這兩種請求,JDBC請求的配置略有區(qū)別:
Select語句
存儲過程
如果對于Oracle,如果測試的是函數(shù),那么也可以使用select語句來進行配置,此時可以使用:select 函數(shù)(入參) from dual形式的語句來測試,其中dual是oracle的關鍵字,表示啞表。對于其它廠商的數(shù)據庫產品,請查找手冊。
JMS服務器
MOM 作為消息數(shù)據交換的平臺,也是影響應用執(zhí)行效率的潛在環(huán)節(jié)。在 Java 程序中,是通過 JMS 與 MOM 進行交互的。作為 Java 實現(xiàn)的壓力測試工具,JMeter 也能使用 JMS 對應用的消息交換和相關的數(shù)據處理能力進行測試。這一點應該不難理解,因為在整個測試過程中,JMeter 測試的重點應該是消息的產生者和消費者的本身能力,而不是 MOM本身。
根據 JMS 規(guī)范,消息交換有2種方式:發(fā)布/訂閱和點對點。JMeter針對這兩種情形,分別提供了不同的Sampler進行支持。以下MOM我們使用ActiveMQ 3.2.1,分別描述這兩種消息交換方式是如何使用 JMeter 進行測試。
1. 測試前的準備(兩種情況都適用)
JMeter 雖然能使用 JMS 對 MOM 進行測試,但是它本身并沒有提供JMS需要使用的包。因此,在測試之前需要將這些包復制到 %JMETER_HOME%/lib 下。對于 ActiveMQ 來說,是復制 %ACTIVEMQ_HOME%/lib。%ACTIVEMQ_HOME%/optional 是可選包,可根據實際情況來考慮是否復制。
JMeter 在測試時使用了 JNDI,為了提供 JNDI 提供者的信息,需要提供 jndi.properties。同時需要將 jndi.properties 放到 JMeter 的 classpath 中,建議將它與 bin下的 ApacheJMeter.jar 打包在一起。對于 ActiveMQ,jndi.properties 的示例內容如下:
java.naming.factory.initial = org.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url = tcp://localhost:61616
#指定connectionFactory的jndi名字,多個名字之間可以逗號分隔。
#以下為例:
#對于topic,使用(TopicConnectionFactory)context.lookup("connectionFactry")
#對于queue,(QueueConnectionFactory)context.lookup("connectionFactory")
connectionFactoryNames = connectionFactory
#注冊queue,格式:
#queue.[jndiName] = [physicalName]
#使用時:(Queue)context.lookup("jndiName"),此處是MyQueue
queue.MyQueue = example.MyQueue
#注冊topic,格式:
# topic.[jndiName] = [physicalName]
#使用時:(Topic)context.lookup("jndiName"),此處是MyTopic
topic.MyTopic = example.MyTopic
2. 發(fā)布/訂閱
在實際測試時,發(fā)布者和訂閱者并不是需要同時出現(xiàn)的。例如,有時我們可能想測試單位時間內消息發(fā)布者的消息產生量,此時不需要消息發(fā)布者,只需要訂閱者可以了。本例為了說明這兩種Sampler的使用,因此建立如下的測試計劃:
其中JMS Publisher和JMS Subscriber的屬性:選擇"使用jndi.properties",連接工廠是connectionFactory,主題是MyTopic,其它使用默認配置。對于JMS Publisher,還需提供測試用的文本消息。
啟動ActiveMQ,運行測試計劃。如果配置正確,那么與ActiveMQ成功連接之后,在JMeter的后臺會打印出相關信息。在測試過程中,JMeter 后臺打印可能會出現(xiàn)java.lang.InterruptedException 信息,這個是正,F(xiàn)象,不會影響測試過程和結果。這一點可以從 bin 下的 jmeter.log 看出。
3. 點對點
對于點對點,JMeter只提供了一種Sampler:JMS Point-to-Point。在例子中,建立如下圖的測試計劃:
其中:Communication style是Request Only。對于另一種風格:Request Response,會驗證收到消息的JMS Header中的JMSCorrelationID,以判斷是否是對請求消息的響應。
結論
本文介紹了如何使用JMeter完成常用的三種類型服務器的壓力測試,這三種類型的壓力測試涵蓋了很大一部分的使用情形,然而需要記住的是工具畢竟是工具。效果好不好,關鍵還是在于使用的人。而且,對于壓力測試,測試計劃的好壞是關鍵。針對不同的情況,分析后有針對的進行測試,比起拿槍亂打、無的放矢顯然要高效得多。