1.10 总结——为什么在服务器中进行程序设计
我们在服务器端完成大部分数据操作编程工作,主要优势有以下几点。
1.10.1 性能
我们进行基于数据的计算几乎总是性能为王,也就是,我们会努力使获得数据的时间周期变得更短。通常在一个典型的数据密集型计算中,我们的大多数时间都集中花费在获得数据上。因此,在计算中,如何使数据访问变得更快就是使整个计算过程变得更高效的最好方法。在我的笔记本电脑上,从100000行记录的数据库中,随机查询一行并返回客户端需要花费2.2ms,但是在数据库内部获取数据,这个操作仅仅花费0.12ms。这是快了20倍的性能表现,并且这是客户端与服务器在同一台使用UNIX套接字的机器上运行的结果。如果客户端与服务器之间使用了网络连接,那么这个差距将会变得更大。
一个真实的小故事:
我的一个朋友被叫到一家大公司帮忙(我确定你们肯定都知道这家公司,但是我不能告诉你是哪家),公司希望能让他们的电子邮件发送程序运行得更快速。这家公司已经使用了最新的Java EE技术,实现了自己的电子邮件生成系统,首先从数据库获得数据,然后在服务间传送数据,并且进行几次的序列化与反序列化工作,最后在数据上进行XSLT转换从而产生电子邮件正文。最终的结果是他们每秒钟仅生成了几百封邮件,并且造成反应速度的严重下滑。
当我朋友重写这个进程的时候,他使用数据库内的PL/Perl函数格式化数据,并且使这个查询返回的是完全格式化的电子邮件,就这样,这个程序每秒钟突然开始涌出上万封的电子邮件,然后他们必须增加发送邮件程序的另一个副本,才能将这些邮件发送出去。
1.10.2 易于维护
如果所有的数据操作代码都位于数据库内,那么要么是数据库函数要么是视图,实际的升级过程就会变得非常简单。我们要完成所有这些操作,所需要的仅仅是运行一个DLL脚本(这些脚本重新定义了函数),这样所有的客户端就自动地使用最新的代码,而完成这样的过程不需要停机时间,也不需要几个前端系统和团队之间复杂的协调处理。
1.10.3 保证安全的简单方法
对于存在潜在风险的服务器,如果所有访问都采用函数方式,并且仅仅为数据库的用户授权他们所需的函数,其他函数均不予授权,这样他们无法看到表数据,甚至不知道这些表的存在。所以即使当服务器被恶意破坏,用户可以做的事情也只是不停地调用同一个函数。而且,即便用户使用了自己编写的查询,比如SELECT * FROM users;来获取数据库中的所有数据,也不可能发生盗取密码、邮件或其他敏感信息的情况。
最重要的是,在服务器上开发程序是最有趣的。