Jruby, JDBC, Netezza - PullRequest
       19

Jruby, JDBC, Netezza

1 голос
/ 25 мая 2011

В любом случае, у меня есть такая 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 гем», так как для преодоления чего-либо нового в этой системе необходимо преодолеть большую бюрократию)

Ответы [ 3 ]

1 голос
/ 30 мая 2011

Я столкнулся с этим сценарием с Apache CXF. Мое любимое решение -

не тратьте время на работу кода jruby и просто сделать класс Java сделать это для тебя

, что на 100% гарантированно работает. В вашем случае вы можете скомпилировать / jar свой класс Conn и вызвать его из jruby как

Java::Conn.main()

Ваш кувшин можно поместить в jruby / lib.

PS: Я вижу, вы пробовали множество способов заставить это работать. Вероятно, Ник Зигер может дать некоторое представление об этих проблемах загрузки классов.

0 голосов
/ 29 мая 2011

Когда все остальное терпит неудачу с проблемами с classpath, я обнаружил, что помещение jar в $ JRUBY_HOME / lib всегда работает.

0 голосов
/ 26 мая 2011

Хотя это не решает конкретную проблему использования вашего nzjdbc.jar, я могу вам сказать, что ваш код будет работать с postgresql.jar, поэтому ваша проблема должна быть связана с какой-то особенностью вашего драйвера.Я не уверен, что netezza пытается сделать, но с драйвером postgresql org.postgresql.Driver имеет статический блок инициализации, который просто вызывает javax.sql.DriverManager.registerDriver (new org.postgresql.Driver ()),достаточно просто загрузить этот класс, чтобы зарегистрировать драйвер.

...