ehcache + mysql例子与性能测试
生活随笔
收集整理的這篇文章主要介紹了
ehcache + mysql例子与性能测试
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近用到了ehcache,根據從網上搜集的資料,調試了一個小例子,順帶做了性能測試。cache的效率的確很高,較sql直接查詢性能上升近8000倍。
?
第一步:先在mysql環境中建好TEST,
CREATE TABLE TEST ( TEST_ID bigint(20) ,TEST_NAME varchar(50),TEST_TIME timestamp default CURRENT_TIMESTAMP,TEST_VALUE decimal(10,3) )表結構如下
mysql> describe TEST; +------------+---------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +------------+---------------+------+-----+-------------------+-----------------------------+ | TEST_ID | bigint(20) | YES | | NULL | | | TEST_NAME | varchar(50) | YES | | NULL | | | TEST_TIME | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | | TEST_VALUE | decimal(10,3) | YES | | NULL | | +------------+---------------+------+-----+-------------------+-----------------------------+ 4 rows in set (0.11 sec)第二步,建java工程,建立與TEST表對應bean,
import java.io.Serializable; import java.math.BigDecimal; import java.sql.Timestamp; import java.util.*;public class TEST implements Serializable {private static final long serialVersionUID = 1L;public Long TEST_ID;public String TEST_NAME;public Timestamp TEST_TIME;public BigDecimal TEST_VALUE;@Overridepublic String toString() {return String.format("ID:%s,,,NAME:%s", TEST_ID, TEST_NAME);} }Util類代碼如下:
import java.util.Random;public class Util{public static Random rand = new Random();public static String atoz = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";public static String genString(int length) {StringBuilder re = new StringBuilder(length);re.append(atoz.charAt(rand.nextInt(52)));for (int i = 0; i < length; i++) {re.append(atoz.charAt(rand.nextInt(62)));}return re.toString();}public static double genDouble() {double d1 = 5120 * rand.nextDouble();double d2 = 1024000 * rand.nextDouble();return d1 + d2;} }主程序:
import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.HashMap;import net.sf.ehcache.Cache; import net.sf.ehcache.CacheManager; import net.sf.ehcache.Element;public class Main {private static String dbURL="jdbc:mysql://localhost/test?useUnicode=true&characterEncoding=GBK";private static String user="root";private static String pass="beautiful_mm";private static String dbDriver="com.mysql.jdbc.Driver";private static String FORMAT="yyyy-MM-dd HH:mm:ss";private static SimpleDateFormat dateFormat=new SimpleDateFormat(FORMAT);/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubCacheManager manager = CacheManager.create("./src/main/resources/ehcache.xml");Cache demo = manager.getCache("demoCache");if(null==manager){System.out.println("manager is null? can not get ehcache manager");}else{System.out.println("get ehcache manager succeed!");}try {// 插入10W數據,以備測試traditionalInsert(100000);} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}try {ehcache();} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}Cache cid = manager.getCache("TEST_ID.TEST");long begin = System.currentTimeMillis();for(int i=1;i<10001;i++){Element e5120 = cid.get(new Long(i));}long end1 = System.currentTimeMillis();System.out.println("從cache中查詢10000條數據消耗時間: " + (end1-begin));for(int i=1;i<10001;i++){try {getRecord(i);} catch (Exception e) {// TODO Auto-generated catch block e.printStackTrace();}}long end2 = System.currentTimeMillis();System.out.println("用sql查詢10000條數據消耗時間: " + (end2-end1));}public static HashMap<Long, TEST> simpleCache() throws Exception {HashMap<Long, TEST> cacheid = new HashMap<Long, TEST>();Class.forName(dbDriver);Connection conn = DriverManager.getConnection(dbURL, user, pass);try {long begin = System.currentTimeMillis();Statement s = conn.createStatement();String sql = "SELECT TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE FROM TEST";ResultSet querySet = s.executeQuery(sql);for (int i = 1; querySet.next(); i++) {TEST curr = new TEST();curr.TEST_ID = querySet.getLong(1);curr.TEST_NAME = querySet.getString(2);curr.TEST_TIME = querySet.getTimestamp(3);curr.TEST_VALUE = querySet.getBigDecimal(4);cacheid.put(curr.TEST_ID, curr);}long end = System.currentTimeMillis();System.out.printf("Time:%d\n", (end - begin));} catch (Exception ex) {ex.printStackTrace();} finally {conn.close();}return cacheid;}public static void traditionalInsert(int total) throws Exception {Thread.sleep(3000);Timestamp current = new Timestamp(System.currentTimeMillis());String currentStr = dateFormat.format(current);System.out.println(currentStr);Connection conn = DriverManager.getConnection(dbURL, user, pass);try {long begin = System.currentTimeMillis();conn.setAutoCommit(false);String sql = "INSERT INTO TEST (TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE) VALUES (?, ?, ?, ?)";PreparedStatement ps = conn.prepareStatement(sql);for (int i = 1; i <= total; i++) {ps.setLong(1, i);ps.setString(2, Util.genString(33));ps.setTimestamp(3, current);ps.setBigDecimal(4, new BigDecimal(Util.genDouble()));ps.addBatch();if ((i % 500) == 0) {ps.executeBatch();}}ps.executeBatch();System.out.println("insert !! done");conn.commit();long end = System.currentTimeMillis();System.out.printf("Count:%d Time:%d\n", total, (end - begin));} catch (Exception ex) {ex.printStackTrace();conn.rollback();} finally {conn.close();}}public static void ehcache() throws Exception {CacheManager manager = CacheManager.create("./src/main/resources/ehcache.xml");manager.addCache("TEST_ID.TEST");Cache cid = manager.getCache("TEST_ID.TEST");Class.forName(dbDriver);Connection conn = DriverManager.getConnection(dbURL, user, pass);try {long begin = System.currentTimeMillis();Statement s = conn.createStatement();String sql = "SELECT TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE FROM TEST";ResultSet querySet = s.executeQuery(sql);for (int i = 1; querySet.next(); i++) {TEST curr = new TEST();curr.TEST_ID = querySet.getLong(1);curr.TEST_NAME = querySet.getString(2);curr.TEST_TIME = querySet.getTimestamp(3);curr.TEST_VALUE = querySet.getBigDecimal(4);cid.put(new Element(curr.TEST_ID, curr));}long end = System.currentTimeMillis();System.out.printf("ehcache cost Time:%d\n", (end - begin));} catch (Exception ex) {ex.printStackTrace();} finally {conn.close();}}public static TEST getRecord(int id) throws Exception {TEST ret = null;Class.forName(dbDriver);Connection conn = DriverManager.getConnection(dbURL, user, pass);try {long begin = System.currentTimeMillis();Statement s = conn.createStatement();String sql = "SELECT TEST_ID,TEST_NAME,TEST_TIME,TEST_VALUE from TEST where TEST_ID="+id;ResultSet querySet = s.executeQuery(sql);for (int i = 1; querySet.next(); i++) {TEST curr = new TEST();curr.TEST_ID = querySet.getLong(1);;curr.TEST_NAME = querySet.getString(2);curr.TEST_TIME = querySet.getTimestamp(3);curr.TEST_VALUE = querySet.getBigDecimal(4);return curr;// cid.put(new Element(curr.TEST_ID, curr)); }long end = System.currentTimeMillis();System.out.printf("ehcache cost Time:%d\n", (end - begin));} catch (Exception ex) {ex.printStackTrace();} finally {conn.close();}return ret;} }
最終運行結果:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. get ehcache manager succeed! 2012-11-25 22:28:41 insert !! done Count:100000 Time:14980 ehcache cost Time:5881 從cache中查詢10000條數據消耗時間: 71 用sql查詢10000條數據消耗時間: 500620可以看出,從cache中取數據的效率較直接從DB中查高出7000倍,即使加上構建cache的時間,也勝過查庫約80倍。
目前可以看出,cache的構建時間將會是大范圍應用的一個瓶頸,一個應用的啟動時間會因為cache構建而變的過長,這在應用中想辦法處理。待后續研究。
總結
以上是生活随笔為你收集整理的ehcache + mysql例子与性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数相乘模版
- 下一篇: SQL Server-流程控制 7,Re