gikoha’s blog

個人的メモがわり

rust で JDBC access

[dependencies]
jdbc = {git = "https://github.com/rawrafox/rust-jdbc"}
jvm = { git = "https://github.com/rawrasaur/rust-jvm" }
  • build.rs
fn main() {
    println!("cargo:rustc-link-search=/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/server");
}
  • main.rs
extern crate jdbc;

use jdbc::java::sql::{DriverManager};

fn main() {
  let jvm_options = ["-Djava.class.path=/opt/oracle/instantclient_19_8/ojdbc8.jar", "-Xcheck:jni"];
  let _ = unsafe { jvm::JVM::from_options(&jvm_options) };

  let url = "jdbc:oracle:thin:admin/password@//server/XEPDB1";

  let connection = DriverManager::get_connection(url).unwrap();
  let statement = connection.create_statement().unwrap();
  let result_set = statement.execute_query("SELECT CNAME FROM DCHILD").unwrap();

  while result_set.next().unwrap() {
    let name = result_set.get_string(1).unwrap();
    println!("{}", name.unwrap());
  }
}
  • ビルドすると実行時にdyldがlibjvm.dylibを見つけられないとエラーが出る
  • Error occurred during initialization of VM: ...

  • install_name_tool で無理矢理@rpathを書き換え

    • install_name_tool -change @rpath/libjvm.dylib /Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home/jre/lib/server/libjvm.dylib rustjdbctest
  • 実行

  • WARNINGでまくった後に 実行結果が表示
WARNING in native method: JNI call made without checking exceptions when required to from CallStaticObjectMethod
...
解放マアト(闇マアト)
シャルル
雪ミク