所以不管怎么说,我有一个像这样的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: No suitable driver“,代码如下。
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代码(看起来是等价的)却不能帮助我减轻这些错误。
(同样,任何"install X gem“在这种情况下都不会起作用,因为必须克服大量的官僚作风,才能允许任何新的东西进入这个系统)
发布于 2011-05-30 10:14:44
我在使用Apache CXF时遇到过这种情况。我最喜欢的解决方案是
不会浪费时间让jruby代码工作,只需让java类为您做这件事即可。
,它是100%保证工作的。在本例中,您可以编译/jar Conn类并从jruby中调用它,如下所示
Java::Conn.main()您的jar可以放在jruby/lib中。
PS:我看到你已经尝试了很多方法来让它工作。也许Nick Sieger可以为这些类加载问题提供一些见解。
发布于 2011-05-26 13:25:26
虽然它没有解决使用nzjdbc.jar的具体问题,但我可以告诉您,您拥有的代码将在postgresql.jar上工作,因此您的问题一定是特定于您的驱动程序的某些怪癖。我不知道netezza想要做什么,但是对于postgresql驱动程序,org.postgresql.Driver有一个静态的初始化块,它只是简单地调用javax.sql.DriverManager.registerDriver(新的org.postgresql.Driver()),所以只需加载那个类就足以注册驱动程序。
发布于 2011-05-29 19:51:06
当所有其他方法都因类路径问题而失败时,我发现将jars放在$JRUBY_HOME/lib中总是有效的。
https://stackoverflow.com/questions/6128643
复制相似问题