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

2023-10-31

        做了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怎么保证安全,赶紧给我支两招,我都快疯了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一次数据库的选型,FireBird胜出 的相关文章

  • 如何在 Visual Studio 中更改 Azure 数据库表的列顺序

    我整个下午都在寻找在 MS Visual Studio 2022 中重新排序 Azure 数据库表列的方法 没有运气 在其他应用程序中 可以通过拖动或剪切和粘贴轻松重新排列列 这里无能为力 此时 我什至不确定可以在 VS 中移动列 我只对
  • 分层查询

    我希望我能够解释困扰我的问题 我有以下分层数据集 这只是 34K 记录的子集 PARENT ID CHILD ID EXAM TUDA12802 TUDA12982 N TUDA12982 TUDA12984 J TUDA12984 TUD
  • 无法通过套接字“/var/lib/mysql/mysql.sock”连接到本地 MySQL 服务器 (2)

    当我尝试连接 mysql 时出现以下错误 Can t connect to local MySQL server through socket var lib mysql mysql sock 2 这个错误有解决办法吗 其背后的原因可能是什
  • 使用 PHP 的 MySQL 连接字符串

    我正在尝试通过本地计算机连接到托管在我的服务器上的数据库 我的服务器有cPanel 11 它是一个典型的共享服务器 由CentOS提供支持 安装了PHP和MySQL 准确地说 我在同一台服务器上持有经销商帐户 我想在不同帐户或域之间访问数据
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • 独立对列进行排序,使得所有空值都位于每列的最后

    这是一个名为的示例表animal name color fox brown fox red dog gold 现在 我想要的是这样的结果 fox dog brown gold red 名称应该是结果的列 不同颜色值作为行 我的第一个想法是
  • 是否有适用于所有数据库的标准sql

    如下所示 不同数据库的语法有所不同 是否存在适用于所有数据库的标准方法 有没有什么工具可以将任意sql转换为任意sql SQL Server 2005 CREATE TABLE Table01 Field01 int primary key
  • 了解 SSMS 2008 中关系的更新和删除规则

    当我们定义外键约束时 我对 SQL Server 2008 Management Studio 中的更新和删除规则的含义感到困惑 我也没有找到相关的帮助文档 例如F1帮助 这是屏幕快照 如果有人能描述它们的含义并推荐一些相关文档来阅读 我将
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • MySQL 按重复项从上到下排序

    我有一个lammer问题 因为我不是mysql专业人士 我有类似的字段 id color 1 red 2 green 3 yellow 4 green 5 green 6 red 我想按重复项进行分组 最常见的重复项先进行分组 所以应该这样
  • 即使使用“autoReconnect=true”,MySql JDBC 也会超时[重复]

    这个问题在这里已经有答案了 有时 我的 Java Tomcat6 Debian Squeeze 应用程序无法与 MySql 服务器通信 Tomcat 应用程序位于前端服务器上 而 MySql 位于单独的 仅限 MySql 的机器上 一个典型
  • 单独的逗号分隔值并存储在sql server的表中

    我有一个存储过程 它将逗号分隔的值作为输入 我需要将其分开并需要将其作为单独的行存储在表中 令 SP 的输入为 Rule ID ListType ID Values 1 2 319 400 521 8465 2013 我需要将它存储在一个名
  • 为表中的每个组选择前 N 行

    我面临一个非常常见的问题 即 为表中的每个组选择前 N 行 考虑一个表id name hair colour score列 我想要一个结果集 对于每种头发颜色 都能得到前 3 名得分手的名字 为了解决这个问题 我得到了我所需要的Rick O
  • MyBatis:在一个查询中通过注释收集

    我有一个 xml 映射器 一个选择映射器和一个结果映射器 它工作没有问题 但我想使用注释 我的映射器
  • 自加入表

    我有一张像这样的桌子 Employee name salary a 10000 b 20000 c 5000 d 40000 我想获取所有工资高于A工资的员工 我不想使用任何嵌套或子查询 在采访中被问及并暗示是使用自连接 我真的不知道如何实
  • 如何在 Play java 中创建数据库线程池并使用该池进行数据库查询

    我目前正在使用 play java 并使用默认线程池进行数据库查询 但了解使用数据库线程池进行数据库查询可以使我的系统更加高效 目前我的代码是 import play libs Akka import scala concurrent Ex
  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • 在 postgres 查询中使用列表

    我有一个动态列表 list a b c d 所以长度可能会改变 我想在查询中比较这些列表值 select from student where name in all the list values 我想将列表值传递到此查询中 我怎样才能做
  • SQL - != 'NULL' 的解释

    我的SSMS代码如下 Select top 50 From FilteredContact Where statuscode 1 and emailaddress1 NULL and telephone1 NULL and address1

随机推荐

  • C++:让自己习惯C++(Effective C++)

    文章目录 写在前面 01 视C 为一个语言联邦 02 尽量用const enum inline替换 define 03 尽可能使用const 04 确认对象被使用前已先被初始化 写在前面 这是对Effective C 这本书中的部分内容进行
  • 音乐服务器制作教程,让NAS做音乐服务器

    最终的目的是让手机APP可以随时播放家里NAS上下载的音乐 经过以前的尝试和最近百度谷歌 有了一些成果 分享出来 一 NAS自带服务和手机APP 优点是布署简单 都是直接用 我只用过黑群的软件 只能说可以用 除了特简单再没有什么特点 需要有
  • 用Charles来模拟弱网测试环境

    在我们平时的测试过程中 需要模拟很多的测试场景 比如常见的弱网测试 你不可能说去地铁 停车场实地去测试 那么我们就需要模拟弱网环境 今天就讲一下如何通过charles来模拟弱网环境 1 首先打开Charles 点击Proxy 选择Throt
  • Latex插入参考文献的两种方法—自动与手动

    先忍不住吐槽一下 为啥都21世纪了还有期刊要求参考文献要放在 tex文件里面 使用 bib文件多简洁优美啊 现在我们就来看下latex中插入参考文献的两种方法 第一种 自动方法 使用 bib文件 在主文件 tex的同级目录下创建exampl
  • 6、服务数据的定义和使用

    一 服务数据模型 二 具体实现步骤 1 首先现在功能包中创建一个srv的文件夹 然后在改文件夹下新建一个以 srv为后缀的文件 所举例的该文件的具体内容如下 string name uint8 age uint8 sex uint8 unk
  • 2023最新版Anaconda下载安装教程(非常详细)从零基础入门到精通,看完这一篇就够了

    1 前言 小编的电脑是win10系统的 这里以win10系统安装Anaconda为例 其他的系统安装过程类似 可以照猫画虎 下面请看具体的安装过程 2 下载软件 1 首先去官网上进行下载软件 下载地址 https docs anaconda
  • 专访雅虎刷题狂人曹鹏:10年理论与实践结合的程序员之路

    采访联络员 SophyJ 作者 ly行云流水 所属机构 CSDN高校俱乐部 高校发布地址 http student csdn net mcd topic 163587 941331 摘要 在曹鹏博士的采访过程中 他最长提起的便是感恩 感谢良
  • Floyd算法的原理和实现代码

    原理 假设有向图G V E 采用邻接矩阵存储 设置一个二维数组A用于存放当前顶点之间的最短路径长度 分量A i j 表示当前顶点i gt j的最短路径长度 然后 每次添加一个顶点 同时对A的数组进行筛选优化 期间会产生k个A数组 Ak i
  • 第一个vue程序

    div message h2 school name school moblie h2 div
  • 程序、进程、线程联系以及进程和线程的区别和联系

    程序和进程的区别与联系 程序是一组有序的指令集合是一个静态的概念 一个程序由一组指令组成 以二进制方式存在存储器中 进程是程序及其数据在计算机上的一次运行活动 是一个动态的概念 进程的运行实体是程序 离开的程序的进程没有意义 进程是由程序
  • 交互原型设计工具

    1 axure RP 适合 快速创建应用软件或Web线框图 流程图 原型和规格说明文档 优点 支持交互设计 并可生成规格说明文档和输出HTML原型 Axure RP 集 UX 原型 规范和图表于一身 2 Sketch 适合 为视觉设计师打造
  • 图数据库——大数据时代的高铁

    作者 董小珊 姚臻 责编 仲培艺 zhongpy csdn net 本文为 程序员 原创文章 未经允许不得转载 更多精彩文章请订阅 程序员 如果把传统关系型数据库比做火车的话 那么到现在大数据时代 图数据库可比做高铁 它已成为NoSQL中关
  • IDEA鼠标右击new没有class和interface的解决办法

    IDEA点击new没有class和interface 问题如下图 解决办法 1 File gt Project Structure 如下图所示 2 选择Modules gt 右边Sources中选择所需目录 然后点击 Sources gt
  • 云平台的技术

    约束记录表 简朴 勤劳 谦虚 诚恳 禁止浪费 珍惜时间 虚心学习 纯心做人 1 0 1 1 节制 静默 条理 决断 不恋吃睡 开口有益 规整事务 坚持 迅捷 0 1 1 1 正直 中庸 整洁 宁静 贞洁 敬业负责 不倚势凌人 外表整洁 不纠
  • 【解决】windows安装pycrypto出错问题。error C2061: 语法错误: 标识符“intmax_t”

    1 执行命令报错 pip install pycrypto Installing collected packages pycrypto Running setup py install for pycrypto error ERROR C
  • easyUI Tree树动态刷新子节点

    tree tree url xxx 默认是post请求 checkbox false animate true lines true loadFilter function rows 返回要显示的过滤数据 返回数据时以标准树格式返回的 也就
  • MongodbTemplate 批量更新或者修改

    批量更新或者修改 public void saveOnlineStatusList List
  • 线性反馈移位寄存器 LFSR

    参考连接 添加链接描述 运算基础 模2运算 线性反馈移位寄存器用于产生可重复的伪随机序列PRBS 该电路由n级除法器和异或门组成 在k阶段 寄存器存在初值 Rn 1 R1 R0 称为seed 在k 1阶段 寄存器的值变为 k 1阶段 Rn
  • word2010或以上版本编号变成黑块的正确处理方

    打开编号显示为黑块的文档 把光标放置在黑块的后面 然后在键盘上按左方向键 则黑块变灰色 为选中状态 2 然后按下ctrl shift s 出现应用样式窗口点击 重新应用 黑块显示成正常的编号 3 然后点击 多级列表 按钮 选择 定义新的多级
  • 一次数据库的选型,FireBird胜出

    做了n多年的J2EE应用以后 如何做客户端的BI确实让我一下子摸不到门路 近期的一个客户要求我们给他做基于客户端的BI分析 客户是对外提供重要数据的单位 有很多的客户每年购买他的数据 可以说人家的数据库 每行每列都是钱 在这种情况下 他们非