背景
Play2/Scala 開発環境を作っていて、MySQL JDBCドライバーを経由してローカルマシンのMySQLに接続しようとしたが、上手くいかない。
原因箇所が、
* ライブラリの依存関係不足
* JDBCの設定ミス
* MySQL側の設定や状態がおかしい
と3つあり、変更する箇所を迅速に切り替えつつ、効率的に問題の切り分けをしたかった。
REPLから対話的にJDBCを経由して、MySQLへの接続を試すのが、最も効率的と思い、やってみました。
Scala REPLから対話的に使う
まず、MySQLドライバーをダウンロードし、そのjarファイルをロードしながらScalaのREPLを立ち上げます。
$ scala -classpath PATH_TO/mysql-connector-java-5.1.39-bin.jar
ScalaのREPLが立ち上がりました。
scala>
JDBCをimportします。
scala> import java.sql.{Connection, DriverManager, ResultSet};
import java.sql.{Connection, DriverManager, ResultSet}
MySQLのJDBCドライバーをロードします。
scala> classOf[com.mysql.jdbc.Driver]
res0: Class[com.mysql.jdbc.Driver] = class com.mysql.jdbc.Driver
接続情報を設定します。
scala> val conn_str = "jdbc:mysql://localhost:3306/some_database?user=root&password=''"
conn_str: String = jdbc:mysql://localhost:3306/some_database?user=user_name&password=some_password
接続します。
scala> val conn = DriverManager.getConnection(conn_str)
conn: java.sql.Connection = com.mysql.jdbc.JDBC4Connection@32709393
これで接続されました。
あとは、JDBCのコードを対話的にかけます。
scala> val statement = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
scala> val rs = statement.executeQuery("SELECT * FROM some_table LIMIT 5")
Scalaといいながら、Javaのライブラリを使っているので、90%位はJavaそのものです。
接続を閉じます。
scala> conn.close
ちなみにこの結果、build.sbt上の依存ライブラリの記述に原因があることが迅速にわかりました。今回は、開発環境上で行いましたが、テスト環境上での問題切り分けにも有効ですね、REPL。
その他応用
ScalaからJavaのライブラリが使えることを利用して、REPLで簡単に対話的にライブラリの動作を確認できました。。
その後、調べて、Java REPLもあることを確認。一般的にJava界では、コードやライブラリを対話的に試すっていう感覚が少ないですよね。
自分もRubyとJavaを行ったり来たりしてたのに、これまでJavaでは対話的にコードを触ろうという発想がなかった(固定観怖い)。なので、スクリプト言語では当たり前の対話的な実行方法で、Javaのライブラリを対話的に触れる、というのはすごく新鮮、かつ地味に便利なのではないかなと思い記録