设为首页 加入收藏

TOP

大数据量的处理(三)
2014-11-24 03:15:54 来源: 作者: 【 】 浏览:4
Tags:数据 处理
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

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇表统计信息过旧导致执行慢的sql优.. 下一篇巧用函数索引性能调优

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++中智能指针的性能 (2025-12-25 03:49:29)
·如何用智能指针实现c (2025-12-25 03:49:27)
·如何在 C 语言中管理 (2025-12-25 03:20:14)
·C语言和内存管理有什 (2025-12-25 03:20:11)
·为什么C语言从不被淘 (2025-12-25 03:20:08)