日期:2014-05-16 浏览次数:20580 次
一共两个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.InsertQuery