现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

浅谈工作中使用过的几种数据库

2013-05-03 11:33 工业·编程 ⁄ 共 3310字 ⁄ 字号 暂无评论
     几年的工作下来,也使用过好几种数据库,准确点来说是“数据库管理系统”,有关系型数据库,也有NoSQL。

 

关系型数据库:
 

1.MySQL:开源,性能高,成本低,可靠性高(这些特性往往让他成为很多公司和项目的首选数据库),单拿大规模网站应用来说,我们熟知的如维基百科,Google,和Facebook都是采用的MySQL。但是目前Oracle对MySQL的收购也许会让我们对MySQL免费应用的前景产生一些担忧。

 

我的使用体验:MySQL安装很方便,几乎在下一步下一步过程中就完成了。而且针对MySQL的操作和管理有很多第三方插件支持,我用过的有“MySQL Query Browser”,“Navicat for MySQL”,“SQLyogEnt”个人感觉从使用体验和响应速度上SQLyogEnt更好。编程语言接口方面,MySQL几乎支持所有的主流编程语言,我个人用过纯C++的connector/c++,挺好用的,完全是按照JDBC的规范封装;java的JDBC,Hibernate;MFC的ODBC。

 

说几个工作中遇到的MySQL的小问题(潜规则),不了解时在开发中着实给自己带来了不少的困惑:

 

(1)案例:在一个通讯服务器中写了个MySQL连接池,通过客户端的调用获取连接进行相应的数据库操作,有时候会发现这样一个问题,连接并不为空,但是进行数据库操作时却失败了,心中不免产生了大大的疑问,而且由于这种问题不好复现,所以没找到解决方案,最后经过阅读MySQL文档才发现了导致问题产生的原因:MySQL的有效连接如果在8小时之内没有任何数据库操作就会失效,靠空判断是判断不出来的,必须进行有效性判断,方法可以是随便进行个数据库操作看是否报错,针对连接池而言如果报错就舍弃这个无效连接,再创建一个新的有效连接放入连接池。

 

(2)案例:MySQL最大连接数。这么简单的问题?关于最大连接数大家都知道,MySQL一般默认支持的最大连接数是100,也就是说你已经创建了100个连接,再创建连接就会失败,是吧,大家都知道:)可是不知大家是否知道对于PreparedStatement 也有最大个数,不信你试试看,你去不断地创建PreparedStatement,当达到最大个数时,PreparedStatement 也会无效,不管此时你创建了几个数据库连接。

  

2.Microsoft SQL Server:以前的SQL Server适合于中小企业的数据库解决方案,但是随着新版本的推出,功能和性能的加强已经触及到大型企业的数据库管理。我新近才用过的是SQL Server 2005,对我有感触的一个新功能是”强化XML的处理能力,并新增本地的XML数据类型,以及支持原生XML数据类型的XML查询运算符“。但是从SQL Server的获得上来看,大家也知道,买正版是需要大量资金的,我想小公司一般不会考虑他吧。

 

我的使用体验:安装记不太清楚了,我只记得那时要安装一大堆组件,进行一系列配置,而且需要不小的磁盘空间,这从另一个侧面反映了SQL Server的”复杂“,所以如果MySQL就能满足你的开发需求,建议放弃SQL Server吧,而且从跨平台考虑来看,那就直接可以让他出局了。对于他的管理我使用的是微软自带的Management Studio,个人感觉挺好用的,第三方的有Navicat For SQL Server。在使用SQL Server时给我留下的印象比较深刻的一点:配合Visual studio的服务器资源管理器调试存储过程很爽。

 

3.SQLite:轻量级关系数据库,但是完全支持ACID(原子性, 一致性,隔离性, 持久性),适合应用于小型,单机的项目,其中有篇网络文章详细列举了SQLite的相关资料,有入门知识,社区,局限性介绍,感觉很好也很全,感兴趣的哥们可以看下http://blog.csdn.net/wangguang246/article/details/6090289

 

我的使用体验:用过C++的CppSqlite(codeproject上有开源代码)封装,用过java的JDBC,用过QT的QSQLITE,都操作很简单,但在QT遇到一个问题,不支持数据库操作的异常处理?(反正我没发现),对SQLite考虑最多的局限性就是:不能做到面向表和行的锁定力度,而是数据库级的锁定力度,所以要并发读写是不行了。第三方插件操作管理SQLite我使用的是SQLite Expert Professional,感觉挺好用的。

 

NoSQL:

 

mongoDB:开源的NoSQL数据库,用c++编写。以下引自开源中国社区:“MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

 

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: 

面向集合存储,易存储对象类型的数据。

模式自由。 

支持动态查询。 

支持完全索引,包含内部对象。 

支持查询。 

支持复制和故障恢复。 

使用高效的二进制数据存储,包括大型对象(如视频等)。 

自动处理碎片,以支持云计算层次的扩展性 

支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 

文件存储格式为BSON(一种JSON的扩展) 

可通过网络访问

 

所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个 集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定 义任何模式(schema)。模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。”

 

我的使用体验:我们在项目中使用MongoDB主要是针对日志存储和读取,因为日志量很大,用传统的关系数据库效率太低,而MongoDB在效率方面的表现相当出色(主要是因为MongoDB采用内存映射的关系吧),对于重要的业务逻辑还是使用关系数据库,因为MongoDB不支持事务,而且有一些反馈说MongoDB经常会莫名其妙的丢失数据,所以我们针对并不十分重要的日志储存使用。还有一个问题,我们是使用服务启动的MongoDB的服务端,在此服务异常退出时,MongoDB服务端在下次也不能正常启动,这样就会导致丢失数据的现象,需要手动删除掉数据库目录下的一个锁文件,MongoDB才能正常启用。

 

以下是链接是MongoDB官网提供的对C++接口的的支持http://www.mongodb.org/pages/viewpage.action?pageId=133415, 如果你对json很了解,那么上手MongoDB一定会很快,对于java可以看以下链接”http://www.mongodb.org/display/DOCS/Java+Language+Center“,值得一提的是,依然有对ORM的支持morphia”http://code.google.com/p/morphia/wiki/QuickStart“。

 

本文出自 “永远的朋友” 博客

给我留言

留言无头像?