【问题标题】:JRuby + Sqlitejdbc : No suitable driver found for jdbc:sqlite:JRuby + Sqlitejdbc:没有找到适合 jdbc:sqlite 的驱动程序:
【发布时间】:2012-07-19 03:16:37
【问题描述】:

在我只有一个用户帐户的机器上,我想将作业的输出转储到 sqlite 数据库而不是文本文件。为此,我从 jarfile 运行 jruby。

使用来自本地 GEM_HOME 的 gem (dbi, dbd/Jdbc, jdbc/sqlite3) 的方法不起作用(未找到合适的驱动程序)并且还会从 gem 中产生弃用消息(“include_class 已弃用。使用 java_import。”)

我转向 Zentus 的 sqlitejdbc-v056.jar 并在路径中运行带有 Zentus 的 JRuby:

java -cp .:sqlitejdbc-v056.jar -jar jruby-complete-1.7.0.preview1.jar test.rb

test.rb 受http://www.zentus.com/sqlitejdbc/How to initialize the SQLite3 JDBC driver in JRuby? 启发:

require 'java'
require '/home/jens/jruby/sqlitejdbc-v056.jar'

org.sqlite.JDBC                 # load the driver so DriverManager detects it 
p clazz = Java::JavaClass.for_name("org.sqlite.JDBC")
java.sql.DriverManager.registerDriver( clazz )
#Java::OrgSqlite::JDBC          # alternate means of same

puts "enumerating..."
java.sql.DriverManager.getDrivers.each{ |e| puts e }

connection = java.sql.DriverManager.getConnection 'jdbc:sqlite:/home/jens/jruby/test.db'
begin
  statement = connection.createStatement
  ...
ensure
  connection.close
end

我从中得到的输出是:

class org.sqlite.JDBC
enumerating...
sun.jdbc.odbc.JdbcOdbcDriver@73415727
DriverManager.java:602:in `getConnection': java.sql.SQLException: No suitable driver found for jdbc:sqlite:/home/jens/jruby/test.db
from DriverManager.java:207:in `getConnection'
from NativeMethodAccessorImpl.java:-2:in `invoke0'
    ...

奇怪的是,DriverManager 列出了驱动程序,但认为它不适合 sqlite。

我期待任何建议。

【问题讨论】:

    标签: sqlite jruby


    【解决方案1】:

    首先你应该使用 bundler 来管理你的 gem 依赖。 Bundler 使用 Gemfile 列出您需要的 gem(将其放在脚本所在的位置)。并确保 jruby 在你的路径中。

    在您的情况下,Gemfile 应包含:

    source 'http://rubygems.org'
    
    gem "activerecord-jdbcsqlite3-adapter", ">= 1.2"
    

    然后执行:

    bundle install --path vendor/bundle
    

    然后像这样修改你的脚本:

    require 'rubygems'
    require "java"
    require 'bundler/setup'
    require 'jdbc/sqlite3'
    
    Bundler.require
    org.sqlite.JDBC                 # load the driver so DriverManager detects it 
    p clazz = Java::JavaClass.for_name("org.sqlite.JDBC")
    java.sql.DriverManager.registerDriver( clazz )
    
    puts "enumerating..."
    java.sql.DriverManager.getDrivers.each{ |e| puts e }
    
    connection = java.sql.DriverManager.getConnection 'jdbc:sqlite:/home/jens/jruby/test.db'
    begin
      statement = connection.createStatement
    ensure
      connection.close
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-10
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2011-10-21
      • 1970-01-01
      相关资源
      最近更新 更多