`
stevezheng
  • 浏览: 80225 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一次数据库的选型,FireBird胜出

    博客分类:
  • bi
阅读更多

        做了n多年的J2EE应用以后,如何做客户端的BI确实让我一下子摸不到门路。近期的一个客户要求我们给他做基于客户端的BI分析,客户是对外提供重要数据的单位,有很多的客户每年购买他的数据。可以说人家的数据库,每行每列都是钱。在这种情况下,他们非常害怕入侵,甚至数据都不会放在网上。之前提过很多的方案,从标准的BI平台到客户端采用Web service方式连接服务器获得数据,但是最终都因为“要让数据放在网上”而被枪毙了。

 

        最终确定的设计是采用客户端,也就是说,将客户端的BI工具分发给客户的客户,每月再由客户通过邮件、光盘等方式将付费的数据采用加密的方式传递给数据使用单位。这些单位收到数据后,在客户端打开,客户端负责解密和展示。

 

        BI部分我轻车熟路,由于要“分发”,所以只能选择Opne Source的,我比较看好Jasper Report,可以培训他们使用Ireport做报表,然后将做好的定义文件打包一起分发;客户端程序也不复杂,只需要修改Jasper的viewer就可以了。

 

        除了担心Ireport太次,容易让客户使着使着抓狂(这就是后话了,实在逼得不行,只能围绕IReport再作开发了,好在都有源码)之外,近期最让我烦恼的就是如何选性数据库。要说BI平台数据库的选型,参加革命一两年的同志就可以说出一大堆各种数据库的对比,但是那些都是大型的,反而小型的这次把我难住了。

 

        研究了一圈以后,获得提名的数据库是他们几个:

 

  • access:数据类型有些另类,而且密码太容易被攻破,最大的问题在于要为此付费;
  • hsqldb:这是最可能成为胜利者之一的数据库,支持csv,配置分发容易,但是最终败北在性能上,当单表数据量在100万以上的时候,csv文件达到40兆,执行group by的sql语句用了300秒!这和sql执行效率无关,性能瓶颈在硬盘文件上,毕竟由于hsqldb没有在数据文件存储上花时间,只是挂个csv;
  • firebird:看标题就明白,这是胜利者,下面我会说说它的好处。
  • sybase asa:数据能加密,性能不错,但是败在“需要付费”上;
  • derby:它和fb有一拼,不管在性能上还是在易用性上,但是最终有两点不如fb,第一、embedded版本完全没有数据认证,导致谁都可以打开数据库执行sql语句;第二、数据库是以一个目录存储的,而fb只有一个文件;
  • sqllite:不支持数据加密,另外,对中文,尤其是用中文order by的时候时常错误;还有就是完全没有用户认证;不过据说执行效率不错;
  • mysql:要说最像样的就是这个了,但是严格说起来,虽然mysql也可以不通过安装,直接拷贝就能使用,但是距离embedded还差一块,所以不考虑了。

 

        行了,言归正传,最后firebird胜出,很荣幸的成为这个项目的数据库。原因有这么几个:

 

  1. 数据文件是单一,部署、分发相对简单;
  2. 用户不需要安装,像这个项目,只是用embedded方式,只需要把icudt30.dll、icuin30.dll、icuuc30.dll、jaybird21.dll、fbembed.dll五个文件和目录intl(里面有两个文件,是处理字符集的)放在程序启动目录就行了;
  3. DBC配置、引用比较简单,driver就是一个jaybird-full-2.1.6.jar,看了其他的一些资料,都搞不清他的lib目录里面的其他的jar是做什么的,仔细看说明以后终于明白,原来这个full版本就是其他几个的集成,为了调用方便,人家不但提供了集成,又给你拆开了,你爱用哪个用哪个。有点像Spring的2.5兆的jar和无数个几十k的小文件的关系。
  4. 中文支持的不错,但是要在建库的时候使用GB_2312字符集;
  5. 一个叫FlameRobin的工具也不错,起初有些别扭,窗口和窗口都分着,典型的Linux风格,后来习惯了;

 

最后附上embedded的连接例子吧:

 

long start = Calendar.getInstance().getTimeInMillis();
org.firebirdsql.pool.FBWrappingDataSource dataSource = new org.firebirdsql.pool.FBWrappingDataSource();
// 设定数据库文件
dataSource.setDatabase("TEST.FDB");
// 可以不设
dataSource.setDescription("An example database of test");
// 设定EMBEDDED就行了,说明上写着另外两种type是TYPE2和type4,干什么用的没研究,谁知道回一个阿
dataSource.setType("EMBEDDED");

try {
	dataSource.setLoginTimeout(10);
      // 这个地方是最让我痛苦的,设定了密码没用!下面会说。
	java.sql.Connection c = dataSource.getConnection("user_1", "");

	java.sql.Statement stmt = c.createStatement();
      // 100万的大数据量
	java.sql.ResultSet rs = stmt.executeQuery("SELECT count(id) FROM largedata");
	if(rs.next()) {
		System.out.println("count: " + rs.getString(1));
	}
	stmt.close();
	c.close ();
} catch (java.sql.SQLException e) {
	e.printStackTrace();
	System.out.println("sql exception: " + e.getMessage());
}
System.out.println("==>" + (Calendar.getInstance().getTimeInMillis() - start)/1000);

// 在对id作了索引的情况下,你猜多久?1秒钟!同时做一个count和sum的group by,在没有索引的情况下40秒

 

        补充一把:嵌入式数据库的让我最痛苦的是没有办法做安全设定,一位仁兄说得好:数据文件都给人家了,做什么也没用。

 

        我觉得太有道理了,就拿Derby来说,完全没有安全性设定,谁都可以打开,FB呢,稍微好一点儿,不知道用户名就打不开(这是授权的事,说白了还是没认证),上面的例子,明明数据库的用户是user_1,密码123,但是不论你用什么密码,都能访问数据,但是如果你不知道用户名,就没戏了。

 

        算是瘸子里拔将军吧。

 

        后来,我还煞有介事的google了一把“firebird破解”,你猜怎么着,有高人出的高招:不知道用户名也能照样打开。怎么弄我不说了,万一让“客户的客户们”谁看到了,又要逼着换方案,这谁受得了。

 

 

        不过说真的,要是谁知道embedded FB怎么保证安全,赶紧给我支两招,我都快疯了。

3
2
分享到:
评论
4 楼 ybj316 2017-04-14  
文章很不错,也很愁加密问题。不想别人看到数据库的设计和数据。您文章提到的改用户名,方便告知怎么做的吗?
3 楼 Azi 2008-10-12  
另外一个是推荐Bekerley DB或者Bekerley DB Java Edition。
2 楼 venliong 2008-10-12  
使用SQLite,里面存放加密过的Blob
1 楼 Azi 2008-10-12  
Firebird 是好东西

可以考虑PostgeSQL等

相关推荐

    数据库安装FireBird及FBControl、FlameRobin等工具.rar

    数据库安装FireBird及FBControl、FlameRobin等工具....一个firebird数据库服务器能够管理多个独立的数据库,每一个数据库同时可支持多个客户端连结。总之:它是一个开源的,强大的,可以自由使用的数据库(即使是商业上

    delphi连接firebird数据库

    Firebird则是一个开源的关系型数据库管理系统,它以其稳定性和高性能闻名。当我们需要在Delphi应用中集成数据库功能时,Firebird是一个理想的选择。本篇文章将深入探讨如何在Delphi 7中通过ODBC(Open Database ...

    PC3000固件专用数据库Firebird客户端Firebird-2.0.7.13318_0_win32

    火鸟(Firebird)是一种开放源代码的关系型数据库管理系统,其设计目标是提供高效、稳定且易用的数据存储解决方案。在本案例中,"PC3000固件专用数据库Firebird客户端Firebird-2.0.7.13318_0_win32" 是针对PC3000...

    java读取firebird数据库例子+jar包

    3. **Jaybird-pool-2.1.6.jar**:这是一个连接池实现,用于管理数据库连接,提高性能和资源利用率。在Java应用中,尤其是在高并发环境下,使用连接池可以更有效地管理和重用数据库连接,避免频繁创建和关闭连接带来...

    Firebird 数据库

    Firebird 数据库Firebird 数据库Firebird 数据库Firebird 数据库Firebird 数据库Firebird 数据库Firebird 数据库Firebird 数据库Firebird 数据库Firebird 数据库

    FireBird数据库使用指南

    一、FireBird数据库简介 二、FireBird数据库的安装 三、FireBird.conf配置文件常用参数 四、Firebird预定义函数的安装 五、Firebird的基本数据类型 六、FirebirdSQL内置函数使用说明 七、FireBird SQL语法

    firebird 数据库 安装文件 + 界面工具 最好用的轻量级数据库 有嵌入式版本

    Firebird数据库是一款高效、可靠的开源数据库系统,以其轻量级的特性受到许多用户的青睐。它提供了强大的性能,同时保持了较低的系统资源占用,尤其适合小型到中型企业以及开发人员进行项目开发。在这个压缩包中,您...

    Firebird数据库Firebird.dll供VB6使用:C++dll源码和VB6 Demo源码演示

    仅一个Win32 dll (非COM, 可直接使用), 让VB6拥有强大而不复杂的Firebird数据库,包含...firebird是一个十分小的开源数据库,可作为像Access一样使用的文件型数据库,单用户连接;也能够以服务方式启动,支持多用户访问

    Delphi2009连接火鸟Firebird数据库的源代码及Firebird中文参考资料

    Delphi2009连接火鸟Firebird数据库的示例源代码及操作Firebird数据库的中文参考资料.是嵌入版,不需要服务器,可以直接发布. 注意:发布的时候要带上dbxdrivers.ini和dbxconnections.ini两个配制文件, 这两个文件一般...

    Linux平台下运用Lazarus Firebird开发数据库应用程序.pdf

    在本文中,我们将使用Lazarus和Firebird开发一个简单的数据库应用程序,包括设计数据库结构、创建数据库、开发数据库应用程序、测试和调试等。我们将使用红旗Linux6.0操作系统,Lazarus0.9.26和Firebird2.0。通过...

    java连接firebird数据库的驱动包-Jaybird

    Java连接Firebird数据库的过程中,驱动包扮演着至关重要的角色,它使得Java应用程序能够与Firebird数据库进行通信。本文将详细讲解如何使用Jaybird驱动包来实现这一目标。 Jaybird是Firebird官方推荐的Java JDBC...

    Firebird数据库FDB编辑工具

    Firebird数据库是一款开源、免费的关系型数据库管理系统,它以其高效能、稳定性以及跨平台特性而受到许多开发者的青睐。FDB文件是Firebird数据库的数据文件格式,存储着数据库中的所有表、索引、触发器等数据和结构...

    C#连接firebird嵌入版数据库实例

    这段代码首先打开与数据库的连接,然后执行一个SELECT查询,填充一个数据集,并打印出结果中的每一行数据。 最后,记得在`finally`块中关闭数据库连接,以确保资源得到正确释放。在控制台中运行此程序,你将看到...

    python连接firebird数据库方法

    - **创建数据库**:如果尚未创建数据库,则需要通过Firebird管理工具或其他方式创建一个新的数据库。 - **设置用户权限**:确保用于连接数据库的用户具有足够的权限。 #### 三、连接数据库 下面是一段示例代码,...

    delphi实现excel导入数据库到firebird

    Firebird是一种开源的关系型数据库管理系统,它以其高效、稳定和安全性著称,而Delphi则是一个强大的RAD(快速应用开发)工具,非常适合进行数据库应用程序的开发。 首先,我们需要了解Delphi中与数据库交互的基础...

    FireBird数据库

    FireBird数据库是一款开源的关系型数据库管理系统,以其轻量级、高效、稳定和易用性而受到广大开发者的喜爱。它适用于小型到中型企业应用,尤其适合那些对资源占用有限但需要高性能数据库解决方案的项目。在本文中,...

    Firebird数据库中文版

    我们可以在触发器中写入PSQL语句,默认值,产生异常,firebird现在支持统一触发器,即可以一个触发器中,一次性管理插入,更新,删除的操作。 扩展函数: 我们可以使用C语言,C++,DELPHI写UDF,使用UDF(用户定义...

    FireBird数据库开发参考手册

    FireBird数据库是一种开源的关系型数据库系统,以其高性能、稳定性以及与其他数据库产品相比的轻量级而受到众多开发者的青睐。它被广泛应用于需要高效、可扩展和安全的数据存储解决方案中。本手册提供的信息可以帮助...

    关于 Firebird 数据库 的基础应用

    Firebird 是一个开源的关系型数据库管理系统,它提供了强大的事务处理能力、安全性以及跨平台兼容性。作为一个成熟的数据库系统,Firebird 适用于多种应用场景,包括小型到大型的企业级应用。 1. **Firebird 特点**...

    FireBird 数据库管理工具

    FireBird 数据库管理系统是一款强大的开源关系型数据库系统,以其稳定性、高效性和安全性著称。官方推出的管理工具提供了全面的功能,使数据库的管理、维护和开发变得更加便捷。在本篇文章中,我们将深入探讨...

Global site tag (gtag.js) - Google Analytics