1

所以无论如何我有一个这样的java程序,它完全可以工作。

1 import java.sql.*;
2 import org.netezza.*;

class Conn {
 public static void main (String args []) throws SQLException {
  6         try{Class.forName ("org.netezza.Driver");
  7         }
  8         catch (ClassNotFoundException e) {
  9             System.out.println("You made it to here");
 10             e.printStackTrace();
 11         }
 12
 13         Connection conn = DriverManager.getConnection("jdbc:netezza://server/dbname", "user", "pass");
 14
 15         Statement stmt = conn.createStatement();
 16         ResultSet rset = stmt.executeQuery("SELECT 'foo'");
 17         while (rset.next()){
 18             System.out.println(rset.getString(1));
 19         }
 20         stmt.close();
 21         conn.close();
 22     }
 23 }

但是,当我尝试按照互联网上的每个普通 JDBC + Jruby 教程进行操作时,我会收到无处不在的错误“NativeException:java.sql.SQLException:没有合适的驱动程序”这个代码。

  1 require 'java'
  2 require 'jruby'
  3 require 'nzjdbc.jar'
  4 #F = java.io.File
  5 #class_loader = JRuby.runtime.jruby_class_loader
  6 #class_loader.add_url(F.new('path').to_url)
  7 #class_loader.add_url(F.new('nzjdbc.jar').to_url)
  8
  9 include_class "java.sql.DriverManager"
 10 include_class "org.netezza.Driver"
 11
 12 p $CLASSPATH
 13 p $LOAD_PATH
 14
 15 server = 'server'
 16 databaseName = 'dbname'
 17 user = 'user'
 18 pass = 'pass'
 19
 20 p DRVRMAN = org.netezza.Driver.new
 21
 22 begin
 23     #clazz = Java::JavaClass.for_name("org.netezza.Driver")
 24     clazz = java.lang.Class.for_name("org.netezza.Driver", true, JRuby.runtime.jruby_class_loader)
 25     #java.lang.Thread.currentThread.setContextClassLoader(JRuby.runtime.jruby_class_loader)
 26     #java.sql.DriverManager.registerDriver(Java::OrgNetezza::Driver.new)
 27     url = "jdbc:netezza://" + server + "/" + databaseName
 28     p url
 29     conn = DriverManager.getConnection(url, user, pass)
 30     stmt = conn.create_statement
 31     rs = stmt.execute_query("SELECT 2 + 2")
 32
 33     while rs.next
 34         p [rs.get_int(1)]
 35     end
 36 ensure
 37     rs.close rescue nil
 38     stmt.close rescue nil
 39     conn.close rescue nil
 40 end

我已经尝试了我能找到的一切来解决这个问题,包括检查 activerecord-jdbc 和 dbi-jdbc 实现。它非常令人沮丧,我想除了类加载器、加载路径和类路径有问题之外,我真的不明白发生了什么。无论如何,我希望有人可以逐步解释 DriverManager 如何在 Java 中注册驱动程序,以及为什么 java 代码完全成功,而 ruby​​ 代码(似乎等效)并不能帮助我减轻这些错误。

(此外,任何“安装 X gem”在这种情况下都不起作用,因为必须克服大量的官僚主义,才能允许任何新的东西进入这个系统)

4

3 回答 3

1

我在使用 Apache CXF 时遇到过这种情况。我最喜欢的解决方案是

不要浪费时间让 jruby 代码工作,只需让一个 java 类为你做这件事

,这是 100% 保证工作。在您的情况下,您可以编译/jar 您的 Conn 类并从 jruby 调用它,例如

Java::Conn.main()

你的 jar 可以放在 jruby/lib 中。

PS:我看到你已经尝试了很多方法来让它工作。可能Nick Sieger可以对这些类加载问题提供一些见解。

于 2011-05-30T02:14:44.287 回答
0

当所有其他方法都因类路径问题而失败时,我发现将 jar 放入 $JRUBY_HOME/lib 总是有效的。

于 2011-05-29T11:51:05.947 回答
0

虽然它没有解决使用 nzjdbc.jar 的具体问题,但我可以告诉您,您拥有的代码将与 postgresql.jar 一起使用,因此您的问题必须特定于您的驱动程序的某些怪癖。我不确定 netezza 想要做什么,但是对于 postgresql 驱动程序,org.postgresql.Driver 有一个静态初始化块,它只调用 javax.sql.DriverManager.registerDriver(new org.postgresql.Driver()),所以只需加载该类就足以让驱动程序注册。

于 2011-05-26T05:25:25.697 回答