ruby

JRuby on railsでのデータベース回りの覚え書き

Railsで作ったアプリケーションをJRubyで動かすときの覚え書きです。

RailsのアプリをそのままJRubyで動かす

テストケースを動かすとエラーになりました。

$ jruby -S rake test:units
(in /home/ksaito/svn/rails/app/trunk)
rake aborted!
can't convert nil into String
(See full trace by running task with --trace)
$

下記情報を参考にmysqlへのアクセスの設定でhostとportを設定すると解決できました。
http://d.hatena.ne.jp/niraikanaibird/20070513

Index: config/database.yml
===================================================================
--- config/database.yml (リビジョン 160)
+++ config/database.yml (作業コピー)
@@ -16,6 +16,8 @@
database: app_development
username: root
password:
+  host: localhost
+  port: 3306
socket: /var/run/mysqld/mysqld.sock
# Warning: The database defined as 'test' will be erased and
@@ -26,6 +28,8 @@
database: app_test
username: root
password:
+  host: localhost
+  port: 3306
socket: /var/run/mysqld/mysqld.sock
production:
@@ -33,4 +37,6 @@
database: app_production
username: root
password:
+  host: localhost
+  port: 3306
socket: /var/run/mysqld/mysqld.sock
$ jruby -S rake test:units
(in /home/ksaito/svn/rails/app/trunk)
/usr/local/root/jruby-1.0/bin/jruby -Ilib:test "/var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" "test/unit/contact_test.rb"
Loaded suite /var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader
Started
....
Finished in 0.432 seconds.
4 tests, 6 assertions, 0 failures, 0 errors
$

mysqlもJDBC経由のアクセスに設定変更する

JRubyで動かすのでmysqlでもJDBC経由でアクセスしてみました。
ActiveRecord-JDBC用に設定変更するには、下記のURLの通りに設定変更します。

mysqlのJDBCドライバをインストール

JDBCドライバのインストールが必要です。
Debian or Ubuntuであればaptを使ってインストール

$ sudo apt-get install libmysql-java

CLASSPATHの設定は下記のようにすると全ユーザでシェアできます。

$ grep mysql /etc/bash.bashrc
# mysql for java
export CLASSPATH=/usr/share/java/mysql-connector-java.jar:$CLASSPATH
$ 
config/environment.rbの設定

こんな感じで修正します。

===================================================================
--- config/environment.rb       (リビジョン 162)+++ config/environment.rb       (作業コピー)
@@ -10,6 +10,10 @@
# Bootstrap the Rails environment, frameworks, and default configuration
require File.join(File.dirname(__FILE__), 'boot')
+require 'rubygems'
+gem 'ActiveRecord-JDBC'
+require 'jdbc_adapter'
+
Rails::Initializer.run do |config|
# Settings in config/environments/* take precedence over those specified here
接続情報の変更

こちらも修正します。

Index: config/database.yml
===================================================================
--- config/database.yml (リビジョン 162)
+++ config/database.yml (作業コピー)
@@ -12,25 +12,24 @@
# And be sure to use new-style password hashing:
#   http://dev.mysql.com/doc/refman/5.0/en/old-client.html
development:
-  adapter: mysql
-  database: app_development
+  adapter: jdbc
username: root
password:
-  socket: /var/run/mysqld/mysqld.sock
+  driver: com.mysql.jdbc.Driver
+  url: jdbc:mysql://localhost:3306/app_development
# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
-  adapter: mysql
-  database: app_test
+  adapter: jdbc
username: root
password:
-  socket: /var/run/mysqld/mysqld.sock
+  driver: com.mysql.jdbc.Driver
+  url: jdbc:mysql://localhost:3306/app_test
production:
-  adapter: mysql
-  database: app_production
+  adapter: jdbc
username: root
password:
-  socket: /var/run/mysqld/mysqld.sock
+  driver: com.mysql.jdbc.Driver
+  url: jdbc:mysql://localhost:3306/app_production
AR-JDBC用のタスクをコピー

テストケースを実行すると失敗します。

$ jruby -S rake test:units
(in /home/ksaito/svn/rails/app/brunches/APP_1_DERBY)
rake aborted!
Task not supported by 'jdbc'
(See full trace by running task with --trace)

下記の情報を参考にAR-JDBCからAR-JDBC用のタスクをコピーすると動きました。
http://d.hatena.ne.jp/akm/?date=20070911

$ cp /var/lib/gems/1.8/gems/ActiveRecord-JDBC-0.5/lib/tasks/jdbc_databases.rake  lib/tasks/
$ jruby -S rake test:units(in /home/ksaito/svn/rails/app/brunches/APP_1_DERBY)
/usr/local/root/jruby-1.0/bin/jruby -Ilib:test "/var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader.rb" "test/unit/contact_test.rb"
Loaded suite /var/lib/gems/1.8/gems/rake-0.7.3/lib/rake/rake_test_loader
Started
....
Finished in 0.9420000000000001 seconds.
4 tests, 6 assertions, 0 failures, 0 errors

ちなみに同じテストケースをRubyで実行した場合は、下記の通りです。
実行時間の差は、Javaの初期化部分かな?

$ rake test:units
(in /home/ksaito/svn/rails/app/trunk)
/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby/1.8/rake/rake_test_loader.rb" "test/unit/contact_test.rb"
Loaded suite /usr/lib/ruby/1.8/rake/rake_test_loader
Started
....
Finished in 0.082573 seconds.
4 tests, 6 assertions, 0 failures, 0 errors
タイトルとURLをコピーしました