📄 testlob.java
字号:
/*
* Copyright 2004-2008 H2 Group. Licensed under the H2 License, Version 1.0
* (license2)
* Initial Developer: H2 Group
*/
package org.h2.test.db;
import java.io.ByteArrayInputStream;
import java.io.CharArrayReader;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringReader;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Random;
import org.h2.constant.SysProperties;
import org.h2.store.FileLister;
import org.h2.test.TestBase;
import org.h2.util.IOUtils;
import org.h2.util.StringUtils;
/**
* Tests LOB and CLOB data types.
*/
public class TestLob extends TestBase {
public void test() throws Exception {
if (config.memory) {
return;
}
testLobDelete();
testLobVariable();
testLobDrop();
testLobNoClose();
testLobTransactions(10);
testLobTransactions(10000);
testLobRollbackStop();
testLobCopy();
testLobHibernate();
testLobCopy(false);
testLobCopy(true);
testLobCompression(false);
testLobCompression(true);
testManyLobs();
testClob();
testUpdateLob();
testLobReconnect();
testLob(false);
testLob(true);
testJavaObject();
}
private void testLobDelete() throws Exception {
if (config.memory) {
return;
}
deleteDb("lob");
Connection conn = reconnect(null);
Statement stat = conn.createStatement();
stat.execute("CREATE TABLE TEST(ID INT, DATA CLOB)");
stat.execute("INSERT INTO TEST SELECT X, SPACE(10000) FROM SYSTEM_RANGE(1, 10)");
ArrayList list = FileLister.getDatabaseFiles(baseDir, "lob", true);
stat.execute("UPDATE TEST SET DATA = SPACE(5000)");
for (int i = 0; i < 3; i++) {
System.gc();
}
stat.execute("CHECKPOINT");
ArrayList list2 = FileLister.getDatabaseFiles(baseDir, "lob", true);
if (list2.size() >= list.size() + 5) {
error("Expected not many more files, got " + list2.size() + " was " + list.size());
}
stat.execute("DELETE FROM TEST");
for (int i = 0; i < 3; i++) {
System.gc();
}
stat.execute("CHECKPOINT");
ArrayList list3 = FileLister.getDatabaseFiles(baseDir, "lob", true);
if (list3.size() >= list.size()) {
error("Expected less files, got " + list2.size() + " was " + list.size());
}
conn.close();
}
private void testLobVariable() throws Exception {
deleteDb("lob");
Connection conn = reconnect(null);
Statement stat = conn.createStatement();
stat.execute("CREATE TABLE TEST(ID INT, DATA CLOB)");
stat.execute("INSERT INTO TEST VALUES(1, SPACE(100000))");
stat.execute("SET @TOTAL = SELECT DATA FROM TEST WHERE ID=1");
stat.execute("DROP TABLE TEST");
stat.execute("CALL @TOTAL LIKE '%X'");
stat.execute("CREATE TABLE TEST(ID INT, DATA CLOB)");
stat.execute("INSERT INTO TEST VALUES(1, @TOTAL)");
stat.execute("INSERT INTO TEST VALUES(2, @TOTAL)");
stat.execute("DROP TABLE TEST");
stat.execute("CALL @TOTAL LIKE '%X'");
conn.close();
}
private void testLobDrop() throws Exception {
if (config.logMode == 0 || config.networked) {
return;
}
deleteDb("lob");
Connection conn = reconnect(null);
Statement stat = conn.createStatement();
for (int i = 0; i < 500; i++) {
stat.execute("CREATE TABLE T" + i + "(ID INT, C CLOB)");
}
stat.execute("CREATE TABLE TEST(ID INT, C CLOB)");
stat.execute("INSERT INTO TEST VALUES(1, SPACE(10000))");
for (int i = 0; i < 500; i++) {
stat.execute("DROP TABLE T" + i);
}
ResultSet rs = stat.executeQuery("SELECT * FROM TEST");
while (rs.next()) {
rs.getString("C");
}
conn.close();
}
private void testLobNoClose() throws Exception {
if (config.logMode == 0 || config.networked) {
return;
}
deleteDb("lob");
Connection conn = reconnect(null);
conn.createStatement().execute("CREATE TABLE TEST(ID IDENTITY, DATA CLOB)");
conn.createStatement().execute("INSERT INTO TEST VALUES(1, SPACE(10000))");
ResultSet rs = conn.createStatement().executeQuery("SELECT DATA FROM TEST");
rs.next();
SysProperties.lobCloseBetweenReads = true;
Reader in = rs.getCharacterStream(1);
in.read();
conn.createStatement().execute("DELETE FROM TEST");
SysProperties.lobCloseBetweenReads = false;
conn.createStatement().execute("INSERT INTO TEST VALUES(1, SPACE(10000))");
rs = conn.createStatement().executeQuery("SELECT DATA FROM TEST");
rs.next();
in = rs.getCharacterStream(1);
in.read();
conn.setAutoCommit(false);
try {
conn.createStatement().execute("DELETE FROM TEST");
conn.commit();
// DELETE does not fail in Linux, but in Windows
// error("Error expected");
// but reading afterwards should fail
int len = 0;
while (true) {
int x = in.read();
if (x < 0) {
break;
}
len++;
}
in.close();
if (len > 0) {
// in Linux, it seems it is still possible to read in files
// even if they are deleted
if (System.getProperty("os.name").indexOf("Windows") > 0) {
error("Error expected; len=" + len);
}
}
} catch (SQLException e) {
checkNotGeneralException(e);
}
conn.rollback();
conn.close();
}
private void testLobTransactions(int spaceLen) throws Exception {
if (config.logMode == 0) {
return;
}
// Constants.LOB_CLOSE_BETWEEN_READS = true;
deleteDb("lob");
Connection conn = reconnect(null);
conn.createStatement().execute("CREATE TABLE TEST(ID IDENTITY, DATA CLOB, DATA2 VARCHAR)");
conn.setAutoCommit(false);
Random random = new Random(0);
int rows = 0;
Savepoint sp = null;
int len = getSize(100, 400);
for (int i = 0; i < len; i++) {
switch (random.nextInt(10)) {
case 0:
trace("insert");
conn.createStatement().execute(
"INSERT INTO TEST(DATA, DATA2) VALUES('" + i + "' || SPACE(" + spaceLen + "), '" + i + "')");
rows++;
break;
case 1:
if (rows > 0) {
trace("delete");
conn.createStatement().execute("DELETE FROM TEST WHERE ID=" + random.nextInt(rows));
}
break;
case 2:
if (rows > 0) {
trace("update");
conn.createStatement().execute(
"UPDATE TEST SET DATA='x' || DATA, DATA2='x' || DATA2 WHERE ID=" + random.nextInt(rows));
}
break;
case 3:
if (rows > 0) {
trace("commit");
conn.commit();
sp = null;
}
break;
case 4:
if (rows > 0) {
trace("rollback");
conn.rollback();
sp = null;
}
break;
case 5:
trace("savepoint");
sp = conn.setSavepoint();
break;
case 6:
if (sp != null) {
trace("rollback to savepoint");
conn.rollback(sp);
}
break;
case 7:
if (rows > 0) {
trace("checkpoint");
conn.createStatement().execute("CHECKPOINT");
trace("shutdown immediately");
conn.createStatement().execute("SHUTDOWN IMMEDIATELY");
trace("shutdown done");
conn = reconnect(null);
conn.setAutoCommit(false);
sp = null;
}
break;
}
ResultSet rs = conn.createStatement().executeQuery("SELECT * FROM TEST");
while (rs.next()) {
String d1 = rs.getString("DATA").trim();
String d2 = rs.getString("DATA2").trim();
check(d1, d2);
}
}
conn.close();
}
private void testLobRollbackStop() throws Exception {
if (config.logMode == 0) {
return;
}
deleteDb("lob");
Connection conn = reconnect(null);
conn.createStatement().execute("CREATE TABLE TEST(ID INT PRIMARY KEY, DATA CLOB)");
conn.createStatement().execute("INSERT INTO TEST VALUES(1, SPACE(10000))");
conn.setAutoCommit(false);
conn.createStatement().execute("DELETE FROM TEST");
conn.createStatement().execute("CHECKPOINT");
conn.createStatement().execute("SHUTDOWN IMMEDIATELY");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -