package jef.database.dialect;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import jef.common.log.LogUtil;
import jef.database.DbCfg;
import jef.database.DbClient;
import jef.database.DebugUtil;
import jef.database.OperateTarget;
import jef.database.innerpool.IConnection;
import jef.database.test.DataSource;
import jef.database.test.DataSourceContext;
import jef.database.test.DatabaseInit;
import jef.database.test.JefJUnit4DatabaseTestRunner;
import jef.orm.onetable.model.TestEntity;
import jef.tools.JefConfiguration;
import jef.tools.StringUtils;
import jef.tools.string.RandomData;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* HSQLDB内存模式测试类
*
* @Date 2012-8-6
*/
@RunWith(JefJUnit4DatabaseTestRunner.class)
@DataSourceContext({
@DataSource(name = "hsqldb", url = "jdbc:hsqldb:mem:testhsqldb", user = "sa", password = "") })
public class HsqlDbMemTest extends org.junit.Assert {
protected DbClient db;
protected static String queryTable = JefConfiguration.get(DbCfg.DB_QUERY_TABLE_NAME);
protected OperateTarget getDefaultTarget() {
return new OperateTarget(db, null);
}
@DatabaseInit
public void prepare(){
try{
createSchema("ad");
createTable();
} catch (Exception e) {
LogUtil.exception(e);
}
}
@Test
public void testExistTable() {
if(StringUtils.isNotEmpty(queryTable)){
try {
assertTrue(db.existTable(queryTable.toUpperCase()));
assertTrue(db.existTable(queryTable.toLowerCase()));
assertTrue(db.existTable("Test_Entity"));
assertTrue(db.existTable("test_entity"));
assertTrue(db.existTable("TEST_ENTITY"));
} catch (SQLException e) {
fail(e.getMessage());
}
}
}
protected void createSchema(String schema) {
IConnection conn = null;
PreparedStatement pstmt = null;
try {
conn = DebugUtil.getConnection(getDefaultTarget());
pstmt = conn.prepareStatement("CREATE SCHEMA " + schema);
pstmt.execute();
} catch (SQLException e) {
fail(e.getMessage());
} catch (Exception e) {
fail(e.getMessage());
} finally {
try {
pstmt.close();
// AfterClass will close conn, so need not call conn.close here.
} catch (SQLException e) {
fail(e.getMessage());
} catch (Exception e) {
fail(e.getMessage());
}
}
}
protected void createTable() throws SQLException {
db.dropTable(TestEntity.class);
db.createTable(TestEntity.class);
}
protected void dropTable(String table) {
IConnection conn = null;
PreparedStatement pstmt = null;
try {
conn = DebugUtil.getConnection(getDefaultTarget());
pstmt = conn.prepareStatement("DROP TABLE " + table);
pstmt.execute();
} catch (SQLException e) {
fail(e.getMessage());
} catch (Exception e) {
fail(e.getMessage());
} finally {
try {
pstmt.close();
// AfterClass will close conn, so need not call conn.close here.
} catch (SQLException e) {
fail(e.getMessage());
} catch (Exception e) {
fail(e.getMessage());
}
}
}
@Test
public void testResultSet() throws SQLException{
memoryOccupied(10);
ResultSet rs=db.getResultSet("select field_1,field_2 from test_entity", 0);
int n=0;
while(rs.next()){
System.out.println(rs.getObject(1));
n++;
}
System.out.println(n);
rs.first();
}
/**
* 测试内存模式下的内存占用,非十分准确,仅作为参考。
*/
@Test
public void testMemoryOccupied() {
try {
memoryOccupied(1000);
// memoryOccupied(10000);
// memoryOccupied(100000);
} catch (Exception e) {
e.printStackTrace();
fail(e.getMessage());
}
}
private void memoryOccupied(int count) throws SQLException {
Runtime.getRuntime().gc();
List<TestEntity> batch =new ArrayList<TestEntity>();
for (int i = 0; i < count; i++) {
batch.add(RandomData.newInstance(TestEntity.class));
}
Runtime.getRuntime().gc();
long freeMemory = Runtime.getRuntime().freeMemory();
// 批量提交过程中的内存消耗也被算进去了
db.batchInsert(batch);
// 这时运行GC有可能反而会导致内存消耗增加
// Runtime.getRuntime().gc();
long occupiedMemory = freeMemory - Runtime.getRuntime().freeMemory();
System.out.printf("存储 %s 条 %s 占用的内存约: %s KB, 平均约 %s B/条.\r\n", count, "TestEntity", occupiedMemory / 1024, occupiedMemory / count);
}
}