Rust による JDBC へのアクセス
- M1 mac では 普通の oracle driverが使えない
- なぜなら未だに m1 用の instant clientが存在しない
- reddit: Instant Client support for Apple's M1
- https://www.reddit.com/r/oracle/comments/k3kpil/instant_client_support_for_apples_m1/
- しかたなく JDBC を使う羽目になった
- ここでは zulu-8.jdk が
/Library/Java/JavaVirtualMachines/zulu-8.jdk/Contents/Home
にインストールされているものとする - intel の人は素直に instant client を使うと簡単
cargo.tomlに追加
[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 ... 解放マアト(闇マアト) シャルル 雪ミク