Java读取超大文本(500M-2G,数据量在100W+)并对数据进行筛选(日期)后保存到SQLServer数据库

Java读取超大文本(500M-2G,数据量在100W+)并对数据进行筛选(日期)后保存到SQLServer数据库,第1张

这种为了自己毕业设计之类问的问题,通常提问者上课从来不听,几乎什么都不懂(因为从提的问题中就可以看出),直接代码发过去也未必会用。

当然答的再好也未必再一次打开百度来采纳答案的问题。我深感头痛。在此发表一下感慨。

通过字符流把一次性把所有数据读出来

把数据split("|")后 放到一个数组里 下标为n%3==0的为第一种类型的数据 为1的是第二种类型

在连接数据库把数组里的数据insert到数据库里 就用原始的jdbc插入就很快了

问题描述 在通常的三层构架下 客户通过Browser请求Web服务器查询数据库 而查询结果是上千条甚至是上百万条记录 要求查询结果传送到客户端浏览器并分页显示

考虑因素

Web服务器的资源消耗 包括 内存(用来存储查询结果) 数据库相关资源(数据库连接对象 ResultSet对象等等)

DB服务器资源的消耗 包括游标 会话等等

网络开销 包括与数据库建立会话 传输查询结果等等

JDBC中的几个重要Class:

A ResultSet object maintains a cursor pointing to its current row of data Initially the cursor is positioned before the first row The next method moves the cursor to the next row and because it returns false when there are no more rows in the ResultSet object it can be used in a while loop to iterate through the result set

ResultSet是直接在数据库上建立游标 然后通过ResultSet的行位置定位接口来获得指定行位置的记录 当用户通过get方法获取具体纪录的内容时 ResultSet才从数据库把所需数据读到客户端

Oracle的ResultSet实现似乎会在本地缓存用户读取过的数据 导致内存消耗会随读取数据的增加而增加 这样 如果一次查询并读取海量数据 即使读出数据后马上丢弃(比如直接写入文件) 内存消耗也会随查询结果的增加而递增

The RowSet interface extends the standard java sql ResultSet interface A RowSet object may make a connection with a data source and maintain that connection throughout its life cycle in which case it is called a connected rowset A rowset may also make a connection with a data source get data from it and then close the connection Such a rowset is called a disconnected rowset A disconnected rowset may make changes to its data while it is disconnected and then send the changes back to the original source of the data but it must reestablish a connection to do so

RowSet是JDBC 中提供的接口 Oracle对该接口有相应实现 其中很有用的是 oracle jdbc rowset OracleCachedRowSet OracleCachedRowSet实现了ResultSet中的所有方法 但与ResultSet不同的是 OracleCachedRowSet中的数据在Connection关闭后仍然有效

解决方案一 直接使用ResultSet来处理

从ResultSet中将查询结果读入collection 缓存在>

1、对应数据库中的表创建实体类(entity),封装a、b、c等字段。

2、使用jdbc查询数据库,一行数据对应一个实体对象,放进一个集合List<entity>中。

下面的代码是读取文本文件的例子,程序会读取texttxt文件,并将它的内容显示出来。

1importjavaio;

2importjavaioFile;

3importjavaioFileReader;

4importjavaio;

5importjavaioIOException;

6

7publicclass

8{

9publicstaticvoidmain(String[]args)

10{

11Filefile=newFile("testtxt");

12contents=new();

13reader=null;

14

15try

16{

17reader=new(newFileReader(file));

18Stringtext=null;

19

20//repeatuntilalllinesisread

21while((text=readerreadLine())!=null)

22{

23contentsappend(text)

24append(SystemgetProperty(

25"lineseparator"));

26}

27}catch(e)

28{

29e();

30}catch(IOExceptione)

31{

32e();

33}finally

34{

35try

36{

37if(reader!=null)

38{

39readerclose();

40}

41}catch(IOExceptione)

42{

43e();

44}

45}

46

47//showfilecontentshere

48Systemoutprintln(contentstoString());

io可以快速的把文件读入后台,在怎么 *** 作我就不会了

从页面向后台传

public static void main(String args[]) {

try{

//定义输入文件流

FileInputStream in = new FileInputStream("C:\\Documents and Settings\\Administrator\\桌面\\新建文件夹\\mediaplayer-59-viral\\20120310flv");

//将文件输入流构造到缓存

BufferedInputStream bin = new BufferedInputStream(in);

//定义输出文件流

File outputFile = new File("C:\\Documents and Settings\\Administrator\\桌面\\新建文件夹\\20120310flv");//定义拷贝目标文件

FileOutputStream out = new FileOutputStream(outputFile);

//将输出文件流构造到缓存

BufferedOutputStream bout = new BufferedOutputStream(out);

Systemoutprintln("--------------------1111");

int c;

//循环读取文件和写入文件

while ((c = binread()) != -1){

boutwrite(c);

boutflush();}

//关闭输入输出流,释放资源

Systemoutprintln("-----------------------12222");

binclose();

boutclose();

}catch(Exception e){

eprintStackTrace();

}

}

sql语句要快1不必要的列就不用查出来;2作为查询的条件列设索引;3如果查询的表数据大于500万条数据,表创建之初就应该建立表分区,依据分表去查;

最最重要的是传输给前台页面的数据量尽量简化减少传输量,比如时间数据最好不传,自己规定个顺序,依据顺序前台生成对应的时间;非要传可转为毫秒数去掉最后四个零(依据实际情况而定,因为时间只要求精确到分),用[]不用{}(key就不用传了,根据商量好的下标对应提取)

你能把你怎么把它插入数据库的那一段代码摘录出来看看吗?

---------------------------------

1

mysql 不支持bool,你可以转化为字符串0,1表示,然后在使用时手工做转换。

2

mysql 支持枚举类型。

ENUM 类型在系统内部可以存储为数字,并且从 1 开始用数字做索引。一个 ENUM 类型最多可以包含 65536 个元素,其中一个元素被 MySQL 保留,用来存储错误信息,这个错误值用索引 0 或者一个空字符串表示。

但是我本人没有使用过枚举类型。

以上就是关于Java读取超大文本(500M-2G,数据量在100W+)并对数据进行筛选(日期)后保存到SQLServer数据库全部的内容,包括:Java读取超大文本(500M-2G,数据量在100W+)并对数据进行筛选(日期)后保存到SQLServer数据库、急急急!java实现将txt文件数据导入数据库中。千万级别的数据。找效率方法。、Java中的大量数据查询等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10195588.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存