巧用Ruby配备Oracle数据库_第1页
巧用Ruby配备Oracle数据库_第2页
巧用Ruby配备Oracle数据库_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、巧用Ruby配备Oracle数据库在使用Java时,有两种针对 Oracle的常见驱动程序:纯Java (又叫做瘦)驱动程序和原生 OCI驱动程序。在写作这篇文章的时候, 还没有和基于 JDBC的Java瘦驱动程 序类似的纯 Ruby驱动程序。要连接到 Oracle,用户必须安装 Ruby/Oracle调用接口 (OCI8)库一一个基于Ruby/DBI (数据库接口模块)的数据库驱动程序。RubyDBI提供了一个与数据库无关的、类似于JDBC或ODBC的接口,来实现Ruby和数据库之间的交互。Ruby OCI8驱动程序通过标准的 Oracle客户端软件连接到 Oracle 8到10的所有版本。

2、OCI8是一个 Ruby 包装器,用本地 C代码编写,实际的交互就由它来完成。非 wi ndows 开发人员可以通过输入sudo gem in stall ruby-oci8 来进行安装。 Win dows开发人员可以先从上下该载驱动程序的二进制版本,然后手动安装:可以通过下面的命令行Ruby程序查询一个包含演示(HR)模式的数据库,简单检测您所下载的 Ruby OCI8驱动程序。替换下面命令中Oracle数据库的名称和口令:FI_MGR | Finance Manager | 8200 | 16000HR_REP | Human Resources Representative | 4000

3、 | 9000IT_PROG | Programmer | 4000 | 10000MK_MAN | Marketing Manager | 9000 | 15000MK_REP | Marketing Representative | 4000 | 9000PR_REP | Public Relations Representative | 4500 | 10500PU_CLERK | Purchasing Clerk | 2500 | 5500PU_MAN | Purchasing Manager | 8000 | 15000SA_MAN | Sales Manager | 10000 |

4、 20000SA_REP | Sales Representative | 6000 | 12000SH_CLERK | Shipping Clerk | 2500 | 5500ST_CLERK | Stock Clerk | 2000 | 5000ST_MAN | Stock Manager | 5500 | 8500Rails配置Rails用于连接到数据库的参数存放在您的Rails应用程序目录中的config/database.yml中。下面的例子引用了主机 xe,它对应tnsnames.ora中的一项。使用 了三种模式,分别用不同的用户名指定。development:lIadapter:

5、ocihost:xeYusername:developmentpassword : passwordtest :adapter:ocihostxeusername:test password : password production: adapter:oci host:xe username:production password : password也可以将 Oracle Easy Connect Naming和Ruby OCI8驱动程序结合使用。用一个Oracle Easy连接字符串替换主机字段中的SID,如下所示:password传递身份验证(Pass-Through Authe nt

6、icati on)目前还没有一个从Rails应用程序到 Oracle的所谓的传递身份验证(一个终端用户使用他或她的 Oracle证书来验证身份。验证通过后,对该应用程序的使用则受Oracle定义的访问权限和限制范围的控制)的标准方法。与Rails相关的涉及传递身份验证的自定义解决方案在理论上是可行的,但也存在各种各样的应用和性能问题。比如,从理论上来讲,我们总可以使用已登录用户的证书创建一个到数据库的新连接。这可以通过在控制器的before_filter方法中建立一个连接(使用该用户的证书)完成。相应的,取消连接需要在after_filter方法中手动完成。与其他问题相比,这种方法的速度非常慢

7、,因为需要为每一个请求建立一个连接。难得就不可简单地将Oracle连接缓存在一个用户会话中吗?很遗憾,不能;因为Rails应用程序没有像 JEE应用程序那样可以在请求间保持活动状态的内存会话存储。所有会话 内容与文件系统的序列化和存储、数据库或分布式缓存相关。假定已经找到在现有连接上验证指定用户身份的难点,那么传递身份验证与ActiveRecord的结合可能会提供某些价值。比如,行级安全性对于一个在数据库级指定的用户来说可以透明的指定该用户可见的对 象,而无需任何实现代码。此外,ActiveRecord的属性动态生成特性也是一大亮点,因为它可以将列级安全性透明的反射到对象模型中。因为属性是动态

8、读取的,所以该模型实例只包含与已登录用户可见的列相匹配的属性。不过要记住,虽然由于性能原因在生产模式下缓存属性信息,但是另一个优化使传递身份验证变成了一个性能问题。对于通过授权实现的表级安全性,您可以假定一旦SQL由于权限问题运行失败,Oracle会从驱动程序引发异常。您可以捕捉这些异常并进行妥善处理,但是如果当作出一 次尝试时一个指定的操作是有效的,这种方法存在的问题就不会出现。比如,如果您想根据用户的插入权限在一张表上禁用一个“ create按钮,那么在执行插入操作之前您无法获知他的权限。可能的变通方法就是在首次建立该连接的时候,将该用户的所有授权和权限信息加载到会话中。然后,可以使用这些

9、授权和权限信息在视图中提供安全特性(根据权限隐藏/禁用按钮),或向模型添加安全性(在执行这项操作之前先用before_save和before_update等回调方法进行权限检查)。当然,这都是理论上的分析,而读取权限信息时可能遇到的困难也是未知的,尤其是在通过存储过程实现时。使用多个数据库建立一个可以和多个数据库交互的Rails应用程序一点都不复杂。您只要在database.yml文件中指定额外的数据库连接参数。比如,假设您需要访问另一个Oracle数据库来读取库存数据:然后,定义一个模型(名为Inventory )来读取库存数据:class Forum < ActiveRecord:B

10、aseself.connection = "inventory"endRails应用程序部署为独立的服务器进程池,并且对于每个rails请求均按进程维护和重用一个数据库连接。我们通常分别使用ActiveRecord:Base.establish_connection和ActiveRecord:Base.connection来建立和检索连接。所有继承ActiveRecord:Base的类都将使用这个连接。您也可以为某些特定的模型建立一个为某个类所特有的连接(如前面所示),然后这个类和它所有的子类将会转而使用这个显示指定的连接。ActiveRecord在ActiveRecord

11、:Base中将一个连接池作为按模型类名索引的散列。当 请求连接时,retrieve_connection方法会向上遍历类层次结构,直到在连接池中找到一个连 接。优化Rails现在还不支持在SQL查询中将变量和Oracle绑定,这对性能造成了一些负面影响。Rails (1.2)的当前版本将Oracle连接选项 cursor_sharing设置为 similar,这通过在数据库级自动将文字转换为绑定变量,显著改善了性能。此外,它还将预取行数设置为100。但无论是游标共享还是预取行数设置都不是理想的解决方案。虽然这两个方案都有可能给服务器带来额外的负担,但是大多数开发人员只片面报告他们连接Oracle的Rails应用程序在性能方面的显著改进,这使我们误以为这两个方案在大多数情况下都有效。但您的体会可能与此不同。如果您需要额外的性能优化,Ruby OCI驱动程序可以利用多种其他属性来调整数据库连接,只是 Rails没有提供一个设置这些属性的标准方法。要了解更多

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论