package jef.orm; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import jef.database.DbClient; import jef.database.DbClientBuilder; import jef.database.DebugUtil; import jef.database.ORMConfig; import jef.database.OperateTarget; import jef.database.Transaction; import jef.database.jdbc.result.IResultSet; import jef.database.jdbc.result.ResultSetContainer; import jef.database.jdbc.result.ResultSetHolder; import jef.database.jdbc.rowset.CachedRowSetImpl; import jef.database.wrapper.clause.InMemoryOrderBy; import jef.orm.onetable.model.Foo; import jef.tools.string.RandomData; import org.junit.BeforeClass; import org.junit.Test; public class OrderPerformanceTest { private static ResultSet rs1; private static ResultSet rs2; private static ResultSet rs3; @Test public void addRecord() throws SQLException { ORMConfig.getInstance().setCacheDebug(true); DbClient db = new DbClientBuilder().setEnhancePackages("jef.orm.onetable.model").build(); Transaction tx = db.startTransaction(); db.createTable(Foo.class); List<Foo> list = new ArrayList<Foo>(); for (int i = 0; i < 10000; i++) { Foo foo = new Foo(); foo.setName(RandomData.randomChineseName()); list.add(foo); } tx.batchInsert(list); tx.commit(true); db.close(); } @BeforeClass public static void prepare() throws SQLException { DbClient db = new DbClientBuilder().build(); CachedRowSetImpl c1 = new CachedRowSetImpl(); CachedRowSetImpl c2 = new CachedRowSetImpl(); CachedRowSetImpl c3 = new CachedRowSetImpl(); Connection conn = DebugUtil.getConnection(db.getSqlTemplate(null)); Statement st = conn.createStatement(); ResultSet rs; rs = st.executeQuery("select * from foo where id>0 and id<= 25000"); c1.populate(rs); rs.close(); rs = st.executeQuery("select * from foo where id>25000 and id<= 30000"); c2.populate(rs); rs.close(); rs = st.executeQuery("select * from foo where id>30000 and id<=35000"); c3.populate(rs); rs.close(); System.out.println(c1.size()); System.out.println(c2.size()); System.out.println(c3.size()); rs1 = c1; rs2 = c2; rs3 = c3; st.close(); db.close(); } @Test public void run1() throws SQLException { DbClient db = new DbClientBuilder().build(); testOrder1Count(db, 1); // 预热 testOrder1(db, 100);// 正式测试 db.close(); } public void testOrder1(DbClient db, int count) throws SQLException { OperateTarget tx = (OperateTarget) db.getSqlTemplate(null); ResultSetContainer mrs = new ResultSetContainer(false); mrs.add(new ResultSetHolder(tx, null, rs1)); mrs.add(new ResultSetHolder(tx, null, rs2)); mrs.add(new ResultSetHolder(tx, null, rs3)); mrs.setInMemoryOrder(new InMemoryOrderBy(new int[] { 1 }, new boolean[] { true })); testRsPerformces(mrs, "simple", count);// 开始测试 } private void testOrder1Count(DbClient db, int count) throws SQLException { OperateTarget tx = (OperateTarget) db.getSqlTemplate(null); ResultSetContainer mrs = new ResultSetContainer(false); mrs.add(new ResultSetHolder(tx, null, rs1)); mrs.add(new ResultSetHolder(tx, null, rs2)); mrs.add(new ResultSetHolder(tx, null, rs3)); mrs.setInMemoryOrder(new InMemoryOrderBy(new int[] { 1 }, new boolean[] { true })); testRsPerformcesCount(mrs, "simple", count);// 开始测试 } private void testRsPerformces(ResultSetContainer mrs, String name, int count) throws SQLException { long start = System.currentTimeMillis(); for (int x = 0; x < count; x++) { // int n=0; IResultSet rs = mrs.toProperResultSet(null); while (rs.next()) { // n++; } // System.out.println(n); rs1.beforeFirst(); rs2.beforeFirst(); rs3.beforeFirst(); } long cost = System.currentTimeMillis() - start; if (count > 5) { System.out.println("----- " + name + "运行" + count + "次,耗时" + cost); } } private void testRsPerformcesCount(ResultSetContainer mrs, String name, int count) throws SQLException { for (int x = 0; x < count; x++) { int n = 0; IResultSet rs = mrs.toProperResultSet(null); while (rs.next()) { n++; } System.out.println("总数" + n); rs1.beforeFirst(); rs2.beforeFirst(); rs3.beforeFirst(); } } }