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)
);
问题出现了,在执行批量建表.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