Amazon

2013年8月31日土曜日

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の通りに設定変更します。


http://jruby-extras.rubyforge.org/ActiveRecord-JDBC/


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





0 件のコメント: