问题出现了,在执行批量建表.bat的时候提示sqlite语法错误。至今也没找到原因:
问题肯定是出现在传递的动态参数上,createTable.bat成功的接到了参数,语句在sqlite中执行不报错,放在bat里就报错。 所以第一次批量建表没成功。
那就用咱们的老本行,写JAVA程序:
需要一个驱动包:sqlitejdbc-v033-nested.jar。
代码如下:
import java.sql.*; import org.sqlite.JDBC; /** * sqlite创建数据库以及批量建表 * @time 2014-01-07 * @author HaiCheng * */ public class createTable { /** * @param args * @throws Exception */ public static void main(String[] args) throws Exception { try{ //1,保证SQLite数据库文件的路径首字符为小写,否则报错 String thisPath = "e:/haicheng.db"; String sql = "jdbc:sqlite://"+thisPath;//windows && linux都适用 //2,连接SQLite的JDBC Class.forName("org.sqlite.JDBC"); //建立一个数据库名haicheng.db的连接,如果不存在就在当前目录下自动创建 Connection conn = DriverManager.getConnection(sql); //3,创建表 Statement stat = conn.createStatement(); for(int i=1 ;i<=20000;i++){ String sql1=" create table bbb"+i+" " + " (" + " ID INTEGER primary key autoincrement," + " STREAMID NUMBER(10)," + " STREAMTYPE NUMBER(1)," + " FAVAILABILITY NUMBER(5)," + " BANDWIDTH NUMBER(4)," + " VALIDBANDWIDTH NUMBER(4)," + " MDI_DF NUMBER(5)," + " MDI_MLR NUMBER(5)," + " DELAY_TIME NUMBER(5)," + " IPINTERVAL NUMBER(5)," + " IPJITTER NUMBER(5)," + " TIME DATE," + " MLT15 NUMBER(5)," + " MLT24 NUMBER(5)," + " MLS NUMBER(5)," + " SLICENUM NUMBER(5)," + " CACHEDTIME NUMBER(5)," + " STUCKTIME NUMBER(5)," + " GETSLICEERR NUMBER(5)," + " RETRANSMITRATE NUMBER(5)," + " REPEATRATE NUMBER(5)," + " SECONDSFLAG NUMBER(5)," + " PART NUMBER(5)" + " );"; System.out.println(sql1); String sql2="CREATE INDEX index_flag"+i+" ON bbb"+i+"(SECONDSFLAG);"; String sql3="CREATE INDEX index_part"+i+" ON bbb"+i+"(PART);"; stat.executeUpdate( sql1 ); stat.executeUpdate( sql2 ); stat.executeUpdate( sql3 ); } stat.close(); conn.close(); //结束数据库的连接 } catch( Exception e ) { e.printStackTrace ( ); } } }
import java.sql.*;
import org.sqlite.JDBC;
/**
* 向第一个表中循环录入数据
* @author HaiCheng
*
*/
public class insertData {
public static void main(String[] args) throws Exception {
try{
//1,保证SQLite数据库文件的路径首字符为小写,并且路径为unix路径
String thisPath = "e:/haicheng.db";
String sql = "jdbc:sqlite://"+thisPath;//windows && linux都适用
//2,连接SQLite的JDBC
Class.forName("org.sqlite.JDBC");
//建立一个数据库名haicheng.db的连接,如果不存在就在当前目录下自动创建
Connection conn = DriverManager.getConnection(sql);
//4,插入一条数据
for(int i=1;i<=86400;i++){
PreparedStatement prep = conn.prepareStatement("insert into bbb1(STREAMID) values ( );");
prep.setInt(1, 0);
prep.addBatch();
conn.setAutoCommit(false);
prep.executeBatch();
}
conn.setAutoCommit(true);
stat.close();
conn.close(); //结束数据库的连接
System.out.println("数据插入成功");
}
catch( Exception e )
{
System.out.println("数据插入异常");
e.printStackTrace ( );
}
}
}
import java.sql.*;
import org.sqlite.JDBC;
/**
* 向其余19999个表中批量拷贝数据
* @author HaiCheng
*
*/
public class copyData {
public static void main(String[] args) throws Exception {
try{
//1,保证SQLite数据库文件的路径首字符为小写,并且路径为unix路径
String thisPath = "e:/haicheng.db";
String sql = "jdbc:sqlite://"+thisPath;//windows && linux都适用
//2,连接SQLite的JDBC
Class.forName("org.sqlite.JDBC");
//建立一个数据库名haicheng.db的连接,如果不存在就在当前目录下自动创建
Connection conn = DriverManager.getConnection(sql);
//3,创建表
Statement stat = conn.createStatement();
for(int i=2;i<=20000;i++){
String sql1="insert into bbb"+i+" select * from bbb1";
System.out.println(sql1);
stat.execute(sql1);
}
stat.close();
conn.close(); //结束数据库的连接
System.out.println("数据插入成功");
}
catch( Exception e )
{
System.out.println("数据插入异常");
e.printStackTrace ( );
}
}
}
依次执行这三个类,当执行第三个类的时候也就是批量向数据库中录入数据的时候,当数据文件大小达到2G的临界点的时候(不同方式测试多遍都是这种情况),再继续写入数据,那么数据文件就会损坏(文件大小都变了,从2GB变成1MB了)。
分析各种原因:
(1)、正在写入数据的时候断电(排除,没有断电)
(2)、磁盘有坏道(排除,在磁盘中放些其他的文件,换一段空间存储这个数据同样到2GB崩溃)
(3)、数据文件所在磁盘空间不足(排除,硬盘空间足够、sqlite也不像Oracle那样有着表空间的概念)
最终我也没找到什么原因,发帖求助。
-------------------------------------------------------------------------------------------------------------------------
上面那些还是年前写的东西,也没有写完。最终是sqlite的问题没有解决。目前还是用着Mysql