`

用PUnit测试下groovy Sql和spring SimpleJdbcTemplate的性能

阅读更多

一共两个UnitTest,一个PUnit的Runner,代码如下

 

package test;

import java.math.BigDecimal;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
//import org.springframework.jdbc.datasource.DriverManagerDataSource;

import com.mchange.v2.c3p0.DriverManagerDataSource;

import junit.framework.TestCase;

public class InsertQueryJava extends TestCase {
	public void testAll() {
		DriverManagerDataSource ds = new DriverManagerDataSource();
//		ds.setUsername("xx");
//		ds.setPassword("xx");
//		ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
//		ds.setUrl("xx");
		
		ds.setUser("xx");
		ds.setPassword("xx");
		ds.setJdbcUrl("xx");
		ds.setDriverClass("oracle.jdbc.driver.OracleDriver");
		
		SimpleJdbcTemplate tpl = new SimpleJdbcTemplate(ds);

		String sql1 = "insert into xxxx(a, b) values ('test', 100)";
		String sql2 = "select a, b from xxxx";

		tpl.update(sql1);
		
		int max = 0;
		List ll = tpl.queryForList(sql2);
		Iterator it = ll.iterator();
		while(it.hasNext()){
			Map item = (Map) it.next();
			BigDecimal x = (BigDecimal) item.get("B");
			if(x.intValue() > max)
				max = x.intValue();
		}
		System.out.println(max);
	}
}

 

 

package test

import com.mchange.v2.c3p0.DriverManagerDataSource;

import groovy.sql.Sql

class InsertQuery extends GroovyTestCase{
	void testAll(){
		def p = [
					url:'xx',
					u:'xx',
					p:'xx',
					driver:'oracle.jdbc.driver.OracleDriver'
				]
//		def db = Sql.newInstance(p.url, p.u, p.p, p.driver)
		
		def ds = new DriverManagerDataSource()
		ds.setUser(p.u)
		ds.setPassword(p.p)
		ds.setJdbcUrl(p.url)
		ds.setDriverClass(p.driver)
		def db = new Sql(ds)
		
		String sql = "insert into xxxx(a, b) values ('test', 100)"
		String sql2 = "select a, b from xxxx"

		db.execute(sql)
		def ll = db.rows(sql2)
		int max = 0
		for(one in ll){
			if(one.b > max)
				max = one.b
		}
		println max
		
//		def item = ll.max{it.b}
//		println item.b
	}
}

 

 

package test;

import org.punit.runner.ConcurrentRunner;

public class Runner {
	public static void main(String[] args) {
		int threadNum = 20;
		new ConcurrentRunner(threadNum).run(InsertQueryJava.class);
		new ConcurrentRunner(threadNum).run(InsertQuery.class);
	}
}

 

windows下jdk1.6.20 groovy1.8.0

通过运行结果发现了几点表面现象:

 

groovy的Sql,直接newInstance比new Sql(datasource)的性能要好

c3p0的DriverManagerDataSource要比spring jdbc的DriverManagerDataSource的性能要好

都编译成class文件后groovy的性能和java的性能几乎一样

 

下面是Runner结果

 

[concurrent] Starting test.InsertQueryJava

test.InsertQueryJava

log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).

log4j:WARN Please initialize the log4j system properly.

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

testAll() - [4292.373611ms]

total: 1, failures:0 (GREEN) - 4331.556105ms

[concurrent] Starting test.InsertQuery

test.InsertQuery

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

testAll() - [6448.14313ms]

total: 1, failures:0 (GREEN) - 6686.467204ms

 

后面为了使得数据源连接池有个池的效果,我用了一个全局的DataSource,结果更吃惊。。groovy竟然效率更高

 

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).

log4j:WARN Please initialize the log4j system properly.

[concurrent] Starting test.InsertQueryJava

test.InsertQueryJava

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

100

testAll() - [1100.632273ms]

total: 1, failures:0 (GREEN) - 1139.438811ms

[concurrent] Starting test.InsertQuery

test.InsertQuery

100

100

100

100

100

100

100

100

testAll() - [237.711986ms]

total: 1, failures:0 (GREEN) - 442.693834ms

100

100

100

100

100

100

100

100

100

100

100

100

 

代码修改如下

package test;

import javax.sql.DataSource;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class ContextHolder {
	static ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
			"classpath*:beans.xml");
	
	public static DataSource getDs(){
		return (DataSource) context.getBean("ds");
	}
}
 package test;
import org.punit.runner.ConcurrentRunner;

public class Runner {
	public static void main(String[] args) {
		ContextHolder.getDs();
		int threadNum = 20;
		new ConcurrentRunner(threadNum).run(InsertQueryJava.class);
		new ConcurrentRunner(threadNum).run(InsertQuery.class);
	}
}
 


分享到:
评论

相关推荐

    pUnit:用于运行基准测试和比较功能性能的简单框架

    用于比较方法的性能和运行基准的简单框架。 对于我的信息,请参阅以下链接: ##指示 创建一个新的类库,通常我使用 .Benchmarks 的命名约定,但这不是强制性的。 从 NuGet 下载包或将 pUnit.dll 的引用添加到...

    P-unit开源的性能测试软件

    p-unit 就是一款开源的性能测试软件,他能帮助你非常好的解决上述问题。多线程支持:同一个测试案例能单线程执行,也能多线程执行,测试案例研发者只需写一套测试案例。

    PUnit-开源

    PUnit 是一个简单的实用程序,可以在任何软件单元上执行回归测试。无需更改代码,因为回归测试是在可执行文件输出上执行的。 要执行的测试在 XML 文件中描述。

    Python库 | punit-1.0.3-py3-none-any.whl

    python库,解压后可用。 资源全名:punit-1.0.3-py3-none-any.whl

    PyPI 官网下载 | punit-1.0.3-py3-none-any.whl

    资源来自pypi官网。 资源全名:punit-1.0.3-py3-none-any.whl

    综合电子设备管理系统的可维护性设计.doc

    首先,系统作为数据中心应用的基础平台,数据中心的 新建应用系统必须依赖于本系统,系统的可靠性和性能直接影响到应用系统的正常运行 ,系统具有较长的生命周期。其次,本项目中的接口子系统是基于ado.net2.0实现的...

    综合电子设备管理系统的可维护性设计(1).doc

    首先,系统作为数据中心应用的基础平台,数据中心的 新建应用系统必须依赖于本系统,系统的可靠性和性能直接影响到应用系统的正常运行 ,系统具有较长的生命周期。其次,本项目中的接口子系统是基于ado.net2.0实现的...

    cloud-rest-api-client:为RESTful API构建客户端时,用于HTTP处理的Java HTTP客户端库

    可以使用以下Maven命令执行库的单元测试 mvn clean install -Punit-tests 用法 将以下依赖项添加到您的maven pom.xml文件中。 <groupId>com.sap.cloud.client</groupId> <artifactId>rest-api-client ${...

    PunitDh.GitHub.io

    Punit Dharmadhikari的T1A2投资组合项目的自述文件 以下是与T1A2作品集提交有关的自述减价文档。 链接到Punit Dharmadhikari的T1A2产品组合URL 请点击访问Punit Dharmadhikari的作品集。 或者,请将下面的链接复制...

    LegoLikeBuildingBlocksofStormandSparkStreamingPipelines.pdf

    在Hadhoop summit 2016上,Anand Venugopal, Punit Shah分享了题为《Lego-Like Building Blocks of Storm and Spark Streaming Pipelines》,就各种流式实现的学习和最佳实践,特定的使用工具等方面的内容做了深入的...

    QuickBill:免费创建无限制的发票

    特此免费授予获得此软件和相关文档文件(“软件”)副本的任何人无限制地处理软件的权利,包括但不限于使用,复制,修改,合并的权利,发布,分发,再许可和/或出售本软件的副本,并允许具备软件的人员这样做,但须...

    Landing_page:开发者的登陆页面!

    分叉或克隆这个 repo 进行某些更改,例如名称和链接转到 Repo 设置并向下滚动到 Github Pages 在源部分中,选择您的分支并单击保存。 瞧! 您的网站应该位于https://{username}.github.io执照麻省理工学院 :...

    visop-vue:一个使用visop来管理路线的Vue前模板

    在src/punit/下出现html,scss,js文件编写业务代码 在src/config.js中配置后台接口地址 在src/js/routeControl.js中控制路由,修改默认路由 use visop quick begin npm install -g visop cd yourproject visop start ...

    EarthquakeCanada

    加拿大地震 Android 应用... 根据日期,大小和省份进行排序(升序和降序)的不同过滤器易于根据地震标题、位置、日期/时间和省份进行搜索截图由开发团队成员Punit Shah ( ) 维伦·古贾里亚桑杰·卡普尔巴努·钱德·雷

    intel_sideband.rar_Linux/Unix编程_Unix_Linux_

    vlv punit read for Linux v2.13.6.

Global site tag (gtag.js) - Google Analytics