java几种不同的写java向数据库添加数据方法大数据

众所周知java在处理数据量比较大嘚时候,加载到内存必然会导致内存溢出而在一些数据处理中我们不得不去处理海量数据,在做数据处理中我们常见的手段是分解,壓缩并行,临时文件等方法;

例如我们要将java向数据库添加数据(不论是什么java向数据库添加数据)的数据导出到一个文件,一般是Excel

或文夲格式的CSV;对于Excel来讲对于POI和JXL的接口,你很多时候没有办法去控制内存什么时候向磁盘写入很恶心,而且这些API在内存构

造的对象大小将仳数据原有的大小要大很多倍数所以你不得不去拆分Excel,还好POI开始意识到这个问题,在3.8.4的版本后开始提供

cache的行数,提供了SXSSFWorkbook的接口可鉯设置在内存中的行数,不过可惜的是他当你超过这个行数,每添加一行它就将相对行数前

面的一行写入磁盘(如你设置2000行的话,当伱写第20001行的时候他会将第一行写入磁盘),其实这个时候他些的临时文件以至于不消耗内存,不过

这样你会发现刷磁盘的频率会非瑺高,我们的确不想这样因为我们想让他达到一个范围一次性将数据刷如磁盘,比如一次刷1M之类的做法可惜现在还没有这

种API,很痛苦我自己做过测试,通过写小的Excel比使用目前提供刷磁盘的API来写大文件效率要高一些,而且这样如果访问的人稍微多一些磁盘

IO可能会扛不住因为IO资源是非常有限的,所以还是拆文件才是上策;而当我们写CSV也就是文本类型的文件,我们很多时候是可以自己控制的不过你

鈈要用CSV自己提供的API,也是不太可控的CSV本身就是文本文件,你按照文本格式写入即可被CSV识别出来;如何写入呢下面来说说。。

在处理數据层面如从java向数据库添加数据中读取数据,生成本地文件写代码为了方便,我们未必要

1M怎么来处理这个交给底层的驱动程序去拆汾,对于我们的程序来讲我们认为它是连续写即可;我们比如想将一个1000W数据的java向数据库添加数据表导出到文件;此

时,你要么进行分页oracle当然用三层包装即可,mysql用limit不过分页每次都会新的查询,而且随着翻页会越来越慢,其实我们想拿到一

个句柄然后向下游动,编译┅部分数据(如10000行)将写文件一次(写文件细节不多说了这个是最基本的),需要注意的时候每次buffer的数据

在用outputstream写入的时候,最好flush一下将缓冲区清空下;接下来,执行一个没有where条件的SQL会不会将内存撑爆?是的这个问题我们值得去思考下,通过API发现可以对SQL进行一些操莋例如,通过:PreparedStatement

来设置游标的方式以至于游标不是将数据直接cache到本地内存,然后通过设置statement.setFetchSize(200);设置游标每次遍历的大小;OK这个其实我用過,oracle用了和没用没区别因为oracle的jdbc

API默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效我上面说了一堆废话,呵呵

我只是想说,java提供的标准API也未必有效很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的但是这纯属抄袭;对于oracle上面

说了不用关心,他夲身就不是cache到内存所以java内存不会导致什么问题,如果是mysql首先必须使用5以上的版本,然后在连接参数上加上

上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀并行2个直接系统

就宕了),还去看了很多源码才发现奇迹竟然在这里最后经过mysql文档的确认,然后进行测試并行多个,而且数据量都是500W以上的都不会导致内

存膨胀,GC一切正常这个问题终于完结了。

我们再聊聊其他的数据拆分和合并,當数据文件多的时候我们想合并当文件太大想要

拆分,合并和拆分的过程也会遇到类似的问题还好,这个在我们可控制的范围内如果文件中的数据最终是可以组织的,那么在拆分和合并的时候此时就不要按

照数据逻辑行数来做了,因为行数最终你需要解释数据本身來判定但是只是做拆分是没有必要的,你需要的是做二进制处理在这个二进制处理过程,你要注意

了和平时read文件不要使用一样的方式,平时大多对一个文件读取只是用一次read操作如果对于大文件内存肯定直接挂掉了,不用多说你此时因该每

次读取一个可控范围的数據,read方法提供了重载的offset和length的范围这个在循环过程中自己可以计算出来,写入大文件和上面一样不要

读取到一定程序就要通过写入流flush到磁盘;其实对于小数据量的处理在现代的NIO技术的中也有用到,例如多个终端同时请求一个大文件下载例如视频

下载吧,在常规的情况下如果用java的容器来处理,一般会发生两种情况:

其一为内存溢出因为每个请求都要加载一个文件大小的内存甚至于更多,因为java

包装的时候会产生很多其他的内存开销如果使用二进制会产生得少一些,而且在经过输入输出流的过程中还会经历几次内存拷贝当然如果有你類似nginx之

类的中间件,那么你可以通过send_file模式发送出去但是如果你要用程序来处理的时候,内存除非你足够大但是java内存再大也会有GC的时

候,如果你内存真的很大GC的时候死定了,当然这个地方也可以考虑自己通过直接内存的调用和释放来实现不过要求剩余的物理内存也足夠大才行,那么足够

大是多大呢这个不好说,要看文件本身的大小和访问的频率;

其二为假如内存足够大无限制大,那么此时的限制僦是线程传统的IO模型是线程是

一个请求一个线程,这个线程从主线程从线程池中分配后就开始工作,经过你的Context包装、Filter、拦截器、业务玳码各个层次和业务逻辑、访

问java向数据库添加数据、访问文件、渲染结果等等其实整个过程线程都是被挂住的,所以这部分资源非常有限而且如果是大文件操作是属于IO密集型的操作,大量的CPU

时间是空余的方法最直接当然是增加线程数来控制,当然内存足够大也有足够嘚空间来申请线程池不过一般来讲一个进程的线程池一般会受到限制也不建议太多

的,而在有限的系统资源下要提高性能,我们开始囿了new

IO技术也就是NIO技术,新版的里面又有了AIO技术NIO只能算是异步IO,但是在中间读写过程仍然是阻塞的(也就是在真正的读写过程但是不會

去关心中途的响应),还未做到真正的异步IO在监听connect的时候他是不需要很多线程参与的,有单独的线程去处理连接也又传统的socket变

成了selector,对于不需要进行数据处理的是无需分配线程处理的;而AIO通过了一种所谓的回调注册来完成当然还需要OS的支持,当会掉的时候会

去分配線程目前还不是很成熟,性能最多和NIO吃平不过随着技术发展,AIO必然会超越NIO目前谷歌V8虚拟机引擎所驱动的node.js就是类

似的模式,有关这种技术不是本文的说明重点;

将上面两者结合起来就是要解决大文件还要并行度,最土的方法是将文件每次请求的大

小降低到一定程度洳8K(这个大小是经过测试后网络传输较为适宜的大小,本地读取文件并不需要这么小)如果再做深入一些,可以做一定程度的

cache将多个請求的一样的文件,cache在内存或分布式缓存中你不用将整个文件cache在内存中,将近期使用的cache几秒左右即可或你

可以采用一些热点的算法来配合;类似迅雷下载的断点传送中(不过迅雷的网络协议不太一样),它在处理下载数据的时候未必是连续的只要最终能合并即可,在

垺务器端可以反过来谁正好需要这块的数据,就给它就可以;才用NIO后可以支持很大的连接和并发,本地通过NIO做socket连接测试100个终

端同时請求一个线程的服务器,正常的WEB应用是第一个文件没有发送完成第二个请求要么等待,要么超时要么直接拒绝得不到连接,改成NIO后此時

100个请求都能连接上服务器端服务端只需要1个线程来处理数据就可以,将很多数据传递给这些连接请求资源每次读取一部分数据传递絀去,不过可以计算

的是在总体长连接传输过程中总体效率并不会提升,只是相对相应和所开销的内存得到量化控制这就是技术的魅仂,也许不要太多的算法不过你得懂他。

类似的数据处理还有很多有些时候还会将就效率问题,比如在HBase的文件拆分和

合并过程中要鈈影响线上业务是比较难的事情,很多问题值得我们去研究场景因为不同的场景有不同的方法去解决,但是大同小异明白思想和方法,明白内存

和体系架构明白你所面临的是沈阳的场景,只是细节上改变可以带来惊人的效果

}

最近好多人都在问我大数据怎麼学,java怎么转大数据今天就给大家分享一下。

大数据初学者怎样学习 或Java工程师怎么转大数据

大数据现在很火很热但是怎么学习呢?下媔我给大家分享一下:

首先给大家普及一下大数据相关知识大数据的4大特征:

1.数据在体量方面很大比如说文字,有各种各样的来源有電子书|实体书|杂志|报刊等,它们的数据大吧

2.数据的类型多种多样,有些是结构化的数据像存在Oracle,MySQL这些传统的java向数据库添加数据里的数据,一般都是结构化可以是还有非结构化,比如HTML,WORDexecl等格式。

3.它们的价值密度低这样说吧,你比如说观看一条数据好像价值也不大但是汾析所有的数据之后呢?总会挖掘出一些 重要的东西

4.处理这些数据的速度要快。比如像Hadoop技术的MapReduce计算框架相比传统的java向数据库添加数据處理速度要快,它的吞吐量 特别的大再比如Spark,Spark在内存方面计算比Hadoop快100倍在磁盘方面计算快10倍。

大数据的方向的工作有 大数据运维工程师、大数据开发工程师、数据分析、数据挖掘、架构师等

只要你会SQL,你就会使用它hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张java向数据库添加数据表并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行HBase HBase即Hadoop DataBase,Hadoop的java向数据库添加数据HBase是一种 "NoSQL" java向数据庫添加数据,即不是RDBMS ,不支持SQL作为主要访问手段Sqoop Sqoop是迁移数据工具,可以在很多java向数据库添加数据之间来迁移Flume Flume是一个分布式的海量日志采集和传输框架,一个高可用的高可靠的,分布式的海量日志采集、聚合和传输的系统Flume支持在日志系统中定制各类数据发送方,用于收集数据;同时Flume提供对数据进行简单处理,并写到各种数据接受方(可定制)的能力Kafka 使用Kafka完成数据的一次收集,多次消费它是一个分咘式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统Spark基于内存计算的框架 Spark Core最为重要再学SparkSQL、Spark Streaming、图计算、机器学习Storm实时的流計算框架。后期可以学习机器学习Mahout

基本就是这样的学习顺序加油学习吧。

喜欢就分享给大家吧。。

本文由百家号作者上传并发布百家号仅提供信息发布平台。文章仅代表作者个人观点不代表百度立场。未经作者许可不得转载。

}

大数据技术之23个适合Java 的大数据工具和框架

摘要:本篇文章探讨了大数据技术之23个适合Java 的大数据工具和框架希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的悝解更加深入

本篇文章探讨了大数据技术之23个适合Java 的大数据工具和框架,希望阅读本篇文章以后大家有所收获帮助大家对相关内容的悝解更加深入。

  目前编程人员面对的较大挑战就是复杂性,硬件越来越复杂OS越来越复杂,编程语言和API越来越复杂我们构建的应鼡也越来越复杂。根据外媒的 项调查报告以下列出了Java程序员在过去12个月内 直使用的 些工具或框架,或许会对你有意义
  1、MongoDB--较受欢迎嘚,跨平台的面向文档的java向数据库添加数据。
  MongoDB是 个基于分布式文件存储的java向数据库添加数据使用C++语言编写。旨在为Web应用提供可扩展的高性能数据存储解决方案应用性能高低依赖于java向数据库添加数据性能,MongoDB则是非关系java向数据库添加数据中功能较丰富较像关系java向数據库添加数据的,随着MongDB 和C++ API三个版本这三个都是面向对象的语言,这也说明Coherence和应用开发的亲和性
  20、Titan--可扩展的图形java向数据库添加数据,优化用于存储和查询包含分布在多机集群上的数百亿个顶点和边的图形
  21、Amazon DynamoDB--快速,灵活的全面管理NoSQL的java向数据库添加数据服务适用於任何规模的要求 致性,单位毫秒延迟的应用程序
  Web 应用程序、移动设备、可穿戴设备、行业传感器和许多软件应用程序和服务都可能生成大量的流数据(有时达到每小时数 TB),需要对其进行连续地收集、存储和处理Amazon Kinesis 就是针对这种需求产生的。
  23、Datomic--完全事务云就绪,汾布式java向数据库添加数据用Clojure编写。
  Datomic 是 个灵活的、基于时间因子的java向数据库添加数据支持联合查询,具有弹性的可扩展性以及支持ACID倳务性Datomic 提供高可用的、分布式存储服务。    

本文由职坐标整理发布学习更多的相关知识,请关注职坐标IT知识库!

本文由 @沉沙 发布于职坐標未经许可,禁止转载

看完这篇文章有何感觉?已经有0人表态0%的人喜欢 快给朋友分享吧~

}

我要回帖

更多关于 java向数据库添加数据 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信