【问题标题】:How to connect to Oracle using JRuby & JDBC如何使用 JRuby 和 JDBC 连接到 Oracle
【发布时间】:2023-03-06 14:46:01
【问题描述】:

第一种方法:裸机

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)

我错过了什么?

谢谢,

【问题讨论】:

标签: oracle jdbc jruby


【解决方案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 驱动程序文件

    【讨论】:

    • 是的,但我认为这种“瘦”连接类型不需要它。
    • 是的,罐子通常就足够了。
    猜你喜欢
    • 2021-05-16
    • 2020-10-21
    • 2012-12-21
    • 1970-01-01
    • 2013-11-01
    • 2021-08-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多