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