
对象持久化就是将对象存储在可持久保存的存储介质上,例如主流的关系数据库中。在实际应用中,需要将业务数据以对象的方式保存在数据库中,就需要应用到相应的对象持久化框架,如现在广为认知的Hibernate。而如果查阅对象持久化的历史,你会发现早在1970年就已经开始有称之为面向对象数据库OODBMS。通常这些面向对象的数据库和特定的一种语言绑定。对象持久化的重点在于如何将业务数据对象存储在持久化介质上,并同时提供查询修改的手段。
数据序列化(Serialization)
数据序列化就是将对象或者数据结构转化成特定的格式,使其可在网络中传输,或者可存储在内存或者文件中。反序列化则是相反的 *** 作,将对象从序列化数据中还原出来。而对象序列化后的数据格式可以是二进制,可以是XML,也可以是JSON等任何格式。对象/数据序列化的重点在于数据的交换和传输,例如在远程调用技术(如EJB,XML-RPC, Web Service),或者在GUI控件开发(JavaBean)等等。
总结一下,对象持久化和对象序列化是两个完全不同的应用场景,尽管你也可以说将一个对象序列化后存储在数据库中,但是你也不能说是对象持久化。B站的历史记录保存时间是有一定限制的,一般情况下为30天左右。如果您的历史记录一直保存,可能是以下几种原因:
1 个人设置问题:您可能在个人设置中开启了“不清空历史记录”的选项,导致历史记录一直保存。
2 缓存问题:您的浏览器或手机APP可能存在缓存问题,导致历史记录没有被清空。
3 网络问题:您的设备可能存在网络问题,导致历史记录无法正常清空。
如果您想清空历史记录,可以尝试以下方法:
1 在B站的“历史记录”页面中,点击“清空历史记录”按钮,将历史记录清空。
2 退出登录后重新登录,可能可以解决缓存问题。
3 清理浏览器缓存或卸载重装APP,可以解决缓存问题。众所周知,java在处理数据量比较大的时候,加载到内存必然会导致内存溢出,而在一些数据处理中我们不得不去处理海量数据,在做数据处理中,我们常见的手段是分解,压缩,并行,临时文件等方法;例如,我们要将数据库(不论是什么数据库)的数据导出到一个文件,一般是Excel或文本格式的CSV;对于Excel来讲,对于POI和JXL的接口,你很多时候没有法去控制内存什么时候向磁盘写入,很恶心,而且这些API在内存构造的对象大小将比数据原有的大小要大很多倍数,所以你不得不去拆分Excel,还好,POI开始意识到这个问题,在384的版本后,开始提供cache的行数,提供了SXSSFWorkbook的接口,可以设置在内存中的行数,不过可惜的是,他当你超过这个行数,每添加一行,它就将相对行数前面的一行写入磁盘(如你设置2000行的话,当你写第20001行的时候,他会将第一行写入磁盘),其实这个时候他些的临时文件,以至于不消耗内存,不过这样你会发现,刷磁盘的频率会非常高,我们的确不想这样,因为我们想让他达到一个范围一次性将数据刷如磁盘,比如一次刷1M之类的做法,可惜现在还没有这种API,很痛苦,我自己做过测试,通过写小的Excel比使用目前提供刷磁盘的API来写大文件,效率要高一些,而且这样如果访问的人稍微多一些磁盘IO可能会扛不住,因为IO资源是非常有限的,所以还是拆文件才是上策;而当我们写CSV,也就是文本类型的文件,我们很多时候是可以自己控制的,不过你不要用CSV自己提供的API,也是不太可控的,CSV本身就是文本文件,你按照文本格式写入即可被CSV识别出来;如何写入呢?下面来说说。。。在处理数据层面,如从数据库中读取数据,生成本地文件,写代码为了方便,我们未必要1M怎么来处理,这个交给底层的驱动程序去拆分,对于我们的程序来讲我们认为它是连续写即可;我们比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些 *** 作,例如,通过:PreparedStatementstatement=connectionprepareStatement(sql),这是默认得到的预编译,还可以通过设置:PreparedStatementstatement=connectionprepareStatement(sql,ResultSetTYPE_FORWARD_ONLY,ResultSetCONCUR_READ_ONLY);来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statementsetFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbcAPI默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如:jdbc:mysql://xxxxxxxxxxxx:3306/abc?zeroDateTimeconvertToNull&useCursorFetch=true&defaultFetchSize=1000上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。我们再聊聊其他的,数据拆分和合并,当数据文件多的时候我们想合并,当文件太大想要拆分,合并和拆分的过程也会遇到类似的问题,还好,这个在我们可控制的范围内,如果文件中的数据最终是可以组织的,那么在拆分和合并的时候,此时就不要按照数据逻辑行数来做了,因为行数最终你需要解释数据本身来判定,但是只是做拆分是没有必要的,你需要的是做二进制处理,在这个二进制处理过程,你要注意了,和平时read文件不要使用一样的方式,平时大多对一个文件读取只是用一次read *** 作,如果对于大文件内存肯定直接挂掉了,不用多说,你此时因该每次读取一个可控范围的数据,read方法提供了重载的offset和length的范围,这个在循环过程中自己可以计算出来,写入大文件和上面一样,不要读取到一定程序就要通过写入流flush到磁盘;其实对于小数据量的处理在现代的NIO技术的中也有用到,例如多个终端同时请求一个大文件下载,例如视频下载吧,在常规的情况下,如果用java的容器来处理,一般会发生两种情况:其一为内存溢出,因为每个请求都要加载一个文件大小的内存甚至于,因为java包装的时候会产生很多其他的内存开销,如果使用二进制会产生得少一些,而且在经过输入输出流的过程中还会经历几次内存拷贝,当然如果有你类似nginx之类的中间件,那么你可以通过send_file模式发送出去,但是如果你要用程序来处理的时候,内存除非你足够大,但是java内存再大也会有GC的时候,如果你内存真的很大,GC的时候死定了,当然这个地方也可以考虑自己通过直接内存的调用和释放来实现,不过要求剩余的物理内存也足够大才行,那么足够大是多大呢?这个不好说,要看文件本身的大小和访问的频率;其二为假如内存足够大,无限制大,那么此时的限制就是线程,传统的IO模型是线程是一个请求一个线程,这个线程从主线程从线程池中分配后,就开始工作,经过你的Context包装、Filter、拦截器、业务代码各个层次和业务逻辑、访问数据库、访问文件、渲染结果等等,其实整个过程线程都是被挂住的,所以这部分资源非常有限,而且如果是大文件 *** 作是属于IO密集型的 *** 作,大量的CPU时间是空余的,方法最直接当然是增加线程数来控制,当然内存足够大也有足够的空间来申请线程池,不过一般来讲一个进程的线程池一般会受到限制也不建议太多的,而在有限的系统资源下,要提高性能,我们开始有了newIO技术,也就是NIO技术,新版的里面又有了AIO技术,NIO只能算是异步IO,但是在中间读写过程仍然是阻塞的(也就是在真正的读写过程,但是不会去关心中途的响应),还未做到真正的异步IO,在监听connect的时候他是不需要很多线程参与的,有单独的线程去处理,连接也又传统的socket变成了selector,对于不需要进行数据处理的是无需分配线程处理的;而AIO通过了一种所谓的回调注册来完成,当然还需要OS的支持,当会掉的时候会去分配线程,目前还不是很成熟,性能最多和NIO吃平,不过随着技术发展,AIO必然会超越NIO,目前谷歌V8虚拟机引擎所驱动的nodejs就是类似的模式,有关这种技术不是本文的说明重点;将上面两者结合起来就是要解决大文件,还要并行度,最土的方法是将文件每次请求的大小降低到一定程度,如8K(这个大小是经过测试后网络传输较为适宜的大小,本地读取文件并不需要这么小),如果再做深入一些,可以做一定程度的cache,将多个请求的一样的文件,cache在内存或分布式缓存中,你不用将整个文件cache在内存中,将近期使用的cache几秒左右即可,或你可以采用一些热点的算法来配合;类似迅雷下载的断点传送中(不过迅雷的网络协议不太一样),它在处理下载数据的时候未必是连续的,只要最终能合并即可,在服务器端可以反过来,谁正好需要这块的数据,就给它就可以;才用NIO后,可以支持很大的连接和并发,本地通过NIO做socket连接测试,100个终端同时请求一个线程的服务器,正常的WEB应用是第一个文件没有发送完成,第二个请求要么等待,要么超时,要么直接拒绝得不到连接,改成NIO后此时100个请求都能连接上服务器端,服务端只需要1个线程来处理数据就可以,将很多数据传递给这些连接请求资源,每次读取一部分数据传递出去,不过可以计算的是,在总体长连接传输过程中总体效率并不会提升,只是相对相应和所开销的内存得到量化控制,这就是技术的魅力,也许不要太多的算法,不过你得懂他。类似的数据处理还有很多,有些时候还会将就效率问题,比如在HBase的文件拆分和合并过程中,要不影响线上业务是比较难的事情,很多问题值得我们去研究场景,因为不同的场景有不同的方法去解决,但是大同小异,明白思想和方法,明白内存和体系架构,明白你所面临的是沈阳的场景,只是细节上改变可以带来惊人的效果。1 由于每次服务器返回的都是HTML模板,存储在前端的数据内容不能方便地持久化,因此前端状态的维护很麻烦。
2 使用LocalStorage或者Cookie来存储数据的安全性比较低,而且不灵活,比如存储的数据删除或者更改需要通过浏览器来解决。
3 基于React的服务端数据持久化方案的开发过程比较复杂,需要考虑到设计模式,路由管理,数据库以及安全等因素。开源世界中的那几个免费数据库
发布时间:2011-11-22 09:34:30 来源:CSDN 评论:0 点击:1476 次 字号:大 中 小
QQ空间 新浪微博 腾讯微博 人人网 豆瓣网 百度空间 百度搜藏 开心网 复制 更多 0
开源数据库MySQLMySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源
开源数据库MySQL
MySQL是一个开放源码的小型关联式数据库管理系统,开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
盘点:开源社区那些免费的数据库软件
MySQL为多种编程语言提供了API,包括C、C++、C#、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl等。而其自身是采用C和C++编写的,使用了多种编译器进行测试,所以,MySQL能够保证源代码具有很强的可移植性。这样的一款数据库,自然能够支持几乎所有的 *** 作系统,从Unix、Linux到Windows,具体包括AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、NetBSD、OpenBSD、OS/2 Wrap、Solaris、SunOS、Windows等多种 *** 作系统。最重要的是,它是一个可以处理拥有上千万条记录的大型数据库。
与此同时,MySQL也产生了很多分支版本的数据库也非常值得推荐。
首先是MariaDB,它是一个采用Maria存储引擎的MySQL分支版本,是由原来MySQL的作者 Michael Widenius创办的公司所开发的免费开源的数据库服务器。与MySQL相比较,MariaDB更强的地方在于它拥有更多的引擎,包括Maria存储引擎、PBXT存储引擎、XtraDB存储引擎、FederatedX存储引擎,它能够更快的复制查询处理、运行的速度更快、更好的功能测试以及支持对Unicode的排序等。
其次是rcona,它为MySQL数据库服务器进行了改进,在功能和性能上较MySQL有着很显著的提升。该版本提升了在高负载情况下的InnoDB的性能,同时,它还为DBA提供一些非常有用的性能诊断工具,并且提供很多参数和命令来控制服务器行为。
第三是Percona Server,它使用了诸如google-mysql-tools、Proven Scaling和 Open Query对MySQL进行改造。并且,它只包含MySQL的服务器版,并没有提供相应对 MySQL的Connector和GUI工具进行改进。
非关系型数据库NoSQL
从NoSQL的字面上理解,NoSQL就是Not Only SQL,被业界认为是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于目前铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
盘点:开源社区那些免费的数据库软件
当然,NoSQL也是随着互联网Web20网站的兴起才能取得长足的进步。关键的需求在于,传统的关系数据库在应付Web20网站,特别是超大规模和高并发的SNS类型的web20纯动态网站显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
首先推荐的是Oracle NoSQL Database,这是一个社区版。Oracle的这个NoSQL Database, 是在10月4号的甲骨文全球大全上发布的Big Data Appliance的其中一个组件,Big Data Appliance是一个集成了Hadoop、NoSQL Database、Oracle数据库Hadoop适配器、Oracle数据库Hadoop装载器及R语言的系统。
其次推荐的是Membase。Membase是NoSQL家族的一个新的重量级的成员。Membase是开源项目,源代码采用了Apache20的使用许可。该项目托管在GitHubSource tarballs上,目前可以下载beta版本的Linux二进制包。该产品主要是由North Scale的memcached核心团队成员开发完成,其中还包括Zynga和NHN这两个主要贡献者的工程师,这两个组织都是很大的在线游戏和社区网络空间的供应商。
并且,Membase容易安装、 *** 作,可以从单节点方便的扩展到集群,而且为memcached(有线协议的兼容性)实现了即插即用功能,在应用方面为开 发者和经营者提供了一个比较低的门槛。做为缓存解决方案,Memcached已经在不同类型的领域(特别是大容量的Web应用)有了广泛的使用,其中 Memcached的部分基础代码被直接应用到了Membase服务器的前端。通过兼容多种编程语言和框架,Membase具备了很好的复用性。在安装和配置方面,Membase提供了有效的图形化界面和编程接口,包括可配置 的告警信息。
Membase的目标是提供对外的线性扩展能力,包括为了增加集群容量,可以针对统一的节点进行复制。 另外,对存储的数据进行再分配仍然是必要的。
第三推荐的是Hibari。Hibari在日语中意思为“云雀”,它是一个专为高可靠性和大数据存储的数据库引擎,可用于云计算环境中,例如 webmail、SNS和其他要求T/P级数据存储的环境中。同时,Hibari也支持Java,C/C++,Python,Ruby和Erlang语言的客户端。
第四推荐的是memcachedb。这是一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是 不需要严格事务约束,能够被持久化保存的应用场景,例如memcachedb被应用在新浪博客上面。
第五推荐的是Leveldb。这是一个Google实现的非常高效的kv数据库,目前的版本12能够支持billion级别的数据量了。 在这个数量级别下还有着非常高的性能,主要归功于它的良好的设计,特别是LSM算法。LevelDB是单进程的服务,性能非常之高,在一台4个Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。
XML数据库的优势
XML数据库是一种支持对XML格式文档进行存储和查询等 *** 作的数据管理系统。在系统中,开发人员可以对数据库中的XML文档进行查询、导出和指定格式的序列化。目前XML数据库有三种类型:XMLEnabledDatabase(XEDB),即能处理XML的数据库;NativeXMLDatabase(NXD),即纯XML数据库;HybridXMLDatabase(HXD),即混合XML数据库。
关系数据库中的第一代XML支持是切分(或分解)文档,以适应关系表格或将文档原封不动地存储为字符或二进制大对象(CLOB 或 BLOB)。这两个方法中的任一种都尝试将XML模型强制转换成关系模型。然而,这两种方法在功能和性能上都有很大的局限性。混合型模型将XML存储在类似于DOM的模型中。XML数据被格式化为缓冲数据页,以便快速导航和执行查询以及简化索引编制。
在这里,首要要推荐的XML数据库是Sedna。它号称是一款原生态的XML数据库,提供了全功能的核心数据库服务,包括持久化存储、ACID事务、索引、安全、热备、UTF8等。实现了 W3C XQuery 规范,支持全文搜索以及节点级别的更新 *** 作。
第二款XML数据库是BaseX。这款数据库用来存储紧缩的XML数据,提供了高效的 XPath和XQuery的实现,同时,它还提供一个前端 *** 作界面。
盘点:开源社区那些免费的数据库软件
第三款推荐的是XMLDB。这款数据库使用了关系型数据库来存储任意的XML文档,因为所采用的存储机制,所以文档的搜索速度特别快,同时执行XSL转换也相当快。XMLDB同时还提供了一个PHP的模块,可以应用在Web应用中。
第四块推荐的是X-Hive/DB。它是一个为需要高级XML数据处理和存储功能的软件开发者设计的强大的专属XML数据库。X-Hive/DB Java API包含存储、查询、检索、转换和发表XML数据的方法。
与传统关系型数据库相比,XML数据库具有以下优势:第一,XML数据库能够对半结构化数据进行有效的存取和管理。如网页内容就是一种半结构化数据,而传统的关系数据库对于类似网页内容这类半结构化数据无法进行有效的管理。第二,提供对标签和路径的 *** 作。传统数据库语言允许对数据元素的值进行 *** 作,不能对元素名称 *** 作,半结构化数据库提供了对标签名称的 *** 作,还包括了对路径的 *** 作。第三,当数据本身具有层次特征时,由于XML数据格式能够清晰表达数据的层次特征,因此XML数据库便于对层次化的数据进行 *** 作。XML数据库适合管理复杂数据结构的数据集,如果己经以XML格式存储信息,则XML数据库利于文档存储和检索;可以用方便实用的方式检索文档,并能够提供高质量的全文搜索引擎。另外XML数据库能够存储和查询异种的文档结构,提供对异种信息存取的支持。
区别如下:
1、速度不同
块存储:低延迟(10ms),热点突出;
文件存储:不同技术各有不同;
对象存储:100ms-1s,冷数据;
2、可分步性不同
块存储:异地不现实;
文件存储:可分布式,但有瓶颈;
对象存储:分步并发能力高;
3、文件大小不同
块存储:大小都可以,热点突出;
文件存储:适合大文件;
对象存储:适合各种大小;
4、接口不同
块存储:Driver,kernel module ;
文件存储:POSIX;
对象存储:Restful API ;
5、典型技术不同
块存储:SAN;
文件存储: HDFS,GFS;
对象存储:Swift,Amazon S3;
6、适合场景不同
块存储:银行;
文件存储:数据中心;
对象存储:网络媒体文件存储;
扩展资料:
文件存储的优缺点:
优点
(1)、造价低:随便一台机器就可以,另外普通的以太网就可以,根本不需要专用的SAN网络,所以造价低。
(2)、方便文件共享。
缺点
(1)、读写速率低,传输速率慢:以太网,上传下载速度较慢,另外所有读写都要1台服务器里面的硬盘来承受,相比起磁盘阵列动不动就十几上百块硬盘同时读写,速率慢了许多。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)