如何使用 JRuby 和 JDBC 连接到 Oracle

Posted

技术标签:

【中文标题】如何使用 JRuby 和 JDBC 连接到 Oracle【英文标题】:How to connect to Oracle using JRuby & JDBC 【发布时间】:2009-04-16 08:22:24 【问题描述】:

第一种方法:裸机

require 'java'
require 'rubygems'
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar"  # should be redundant, but tried it anyway
odriver = Java::JavaClass.for_name("oracle.jdbc.driver.OracleDriver")
puts odriver.java_class
url = "jdbc:oracle:thin:@myhost:1521:mydb"
puts "About to connect..."
con = java.sql.DriverManager.getConnection(url, "myuser", "mypassword");
if con
    puts " connection good"
else
    puts " connection failed"
end

上面的结果是:

sqltest.rb:4: cannot load Java class oracle.jdbc.driver.OracleDriver (NameError)

第二种方法:Active Record

require 'rubygems'
gem 'ActiveRecord-JDBC'
require 'jdbc_adapter'
require 'active_record'
require 'active_record/version'
require "c:/ruby/jruby-1.2.0/lib/ojdbc14.jar"  # should be redundant...

ActiveRecord::Base.establish_connection(
   :adapter => 'jdbc',
   :driver => 'oracle.jdbc.driver.OracleDriver',
   :url => 'jdbc:oracle:thin:@myhost:1521:mydb',
   :username=>'myuser',
   :password=>'mypassword'
 )
ActiveRecord::Base.connection.execute("SELECT * FROM mytable")

这样的结果是:

C:/ruby/jruby-1.2.0/lib/ruby/gems/1.8/gems/activerecord-jdbc-adapter-0.9.1/lib/active_recordconnection_adapters/jdbc_adapter.rb:330:in `initialize': 
The driver encountered an error: cannot load Java class oracle.jdbc.driver.OracleDriver (RuntimeError)

无论我如何处理,基本上都是同样的错误。

我使用的是 JRuby 1.2.0,我的 JRuby lib 目录中有 ojdbc14.jar

宝石:

ActiveRecord-JDBC (0.5) activerecord-jdbc-适配器 (0.9.1) 活动记录 (2.2.2)

我错过了什么?

谢谢,

【问题讨论】:

我很想看看 SO 能否击败 ruby​​ 论坛 (ruby-forum.com/topic/184414) 最初发布到 Nabble nabble.com/Having-problems-accessing-Oracle-td23070394.html 我猜他们不知何故被传播到 Ruby 论坛... 【参考方案1】:

原来我的 ojdbc14.jar 文件已损坏。

此外,jar 文件必须位于 jruby/lib 目录中。仅仅将它放在类路径中是行不通的。

【讨论】:

最近出现在(jruby 特定的)CLASSPATH 环境变量中也足够了,但是仅仅做一个 require 'ojdbc14.jar' 是不行的。 似乎现在你只需要需要 jar,它不再必须在 lib 目录中(1.6.0RC2)【参考方案2】: 需要'java' # 这个require不会将jdbc驱动jar加载到系统类路径中 需要“c:/ruby/jruby-1.2.0/lib/ojdbc14.jar” # 2 种加载类的方法(可能还有更多) # 1 java类名的ruby语法 Java::OracleJdbcDriver::OracleDriver # 2 使用线程上下文类加载器 java.lang.Class.forName("oracle.jdbc.driver.OracleDriver", true, java.lang.Thread.currentThread.getContextClassLoader) url = "jdbc:oracle:thin:@myhost:1521:mydb" 提出“即将连接...” con = java.sql.DriverManager.getConnection(url, "myuser", "mypassword"); 如果骗 把“连接好” 别的 提出“连接失败” 结尾

【讨论】:

我现在正在使用您的示例,但我不明白我将如何运行命令。你能回复我吗?【参考方案3】:

然后在创建后使用它:

b = con.create_statement rs=b.execute_query(“从 SYS.V_$VERSION 中选择 BANNER”) 而(rs.next()) pr rs.getObject(1) # 获取第一列 结尾 rs.close 以及如何处理 oracle 时间戳(例如,如果第 3 列是时间戳): >> rs.getObject(3).timestamp_value.to_string => “1970-01-01 00:00:01.0” >> Date.parse(rs.getObject(3).timestamp_value.to_string) # 或者你可以使用时间,比如 >> as_ruby_time= Date.parse(rs.getObject(3).timestamp_value.to_string).to_time #1.9有这个方法 # 或者 >> as_ruby_time = Time.at(0) + rs.getObject(3).timestamp_value.get_time

【讨论】:

【参考方案4】:

您是否安装了 Oracle 客户端?您可能至少需要来自客户端的 jdbc 驱动程序文件

【讨论】:

是的,但我认为这种“瘦”连接类型不需要它。 是的,罐子通常就足够了。

以上是关于如何使用 JRuby 和 JDBC 连接到 Oracle的主要内容,如果未能解决你的问题,请参考以下文章

如何使用JDBC连接到SQL Server

如何使用 IntelliJ 和 JDBC 建立 SSH 隧道并连接到数据库?

如何使用 jdbc 连接到 oracle

如何使用 JDBC 连接到 SQL Server 2008 数据库?

msSQL jdbc .. 我连接到服务器但如何连接到使用特定的 databaseName

如何将 JDBC 连接到 tns oracle