ksaitoの日記

日々試したことの覚え書き

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
$

mysqlJDBC経由のアクセスに設定変更する

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

mysqlJDBCドライバをインストール

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