Amoeba for MySQL Benchmark高级使用

在现实环境中,程序向Amoeba(或者MySQL)发起的请求通常是随机的。比如:随机查询用户ID、随机查询某一用户的随机数目个好友等等,而这样的情况仅仅用固定的Benchmark语句是无法完成的。

因此有必要在Query中加上动态的随机性,使其能够模仿现实环境的需要。如以下这个较为高级的query文件及其对应的context文件:

Example 6.2. 一个更高级的Benchmark的query文件以及其对应的context文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties version="1.0">
 <entry key="class">com.meidusa.amoeba.mysql.net.packet.QueryCommandPacket</entry>
 <entry key="command">3</entry>
 <entry key="query"><![CDATA[
                     SELECT ID, FRIEND_ID FROM test.FRIEND WHERE ID=${@Math@abs(#random.nextInt(10000))} LIMIT ${@Math@abs(#random.nextInt(100))}, ${@Math@abs(#random.nextInt(100))};1
                    ]]>
 </entry>
</properties>

1

这句语句在test.STAFF表查询随机用户名0-9999的用户;LIMIT随机100条作为offset,随机返回最大100条。

Caution

query.xml文件中的${} 中的内容是属于java表达式,“#”开头的对象定义在 benchmark/context.xml中,“@”开头的对象则是java类静态方法的调用

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE objectMap SYSTEM "http://amoeba.meidusa.com/objectMap.dtd">
<objectMap version="1.0">
        <entry key="random">java.util.Random</entry>1
        <entry key="atomicInteger">java.util.concurrent.atomic.AtomicInteger</entry>
        <entry key="atomicLong">java.util.concurrent.atomic.AtomicLong</entry>
        <entry key="randomRow">
         <bean class="com.meidusa.amoeba.benchmark.FileLineRandomData">
          <property name="file">${amoeba.home}/benchmark/1.txt</property>
         </bean>
        </entry>
</objectMap>

1

此处即是query.xml中使用的random,“#”开头的对象定义在benchmark/context.xml中。其后的atomicInteger、atomicLong也能在query.xml中用到。