Scala+DBMS+Web スカラ座の夜

2012年1月2日

Heroku Embedded Tomcat + Scala2.9.1 + Oracle Database

Filed under: Scala — admin @ 11:49 PM

ScalaでOracle11g データベースをJDBCドライバで純粋にアクセスするコードを書いてみます。

javax.servlet.annotation.WebServlet のアノテーションを使います。Tomcat7のServlet Ver3 ですから。

@WebServlet(Array(“/html”)) と書けるところがいい。

package ews.servlet

import java.io.IOException
import java.util.Date
import java.util._
import javax.servlet.ServletException
import javax.servlet.annotation.WebServlet
import javax.servlet.http.HttpServlet
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse

@WebServlet(Array("/html"))
class htmlSrv extends HttpServlet {
	override def doGet(request : HttpServletRequest, response : HttpServletResponse) : Unit = {
		val out = response.getWriter
		response.setContentType("text/html; charset=UTF-8");

		out.println("<html><body>")
		out.println("hello scala " + new java.util.Date)

		val db = new db01
		db.run(out)

		out.println("</body></html>")
		out.flush
		out.close
	}
}



OracleJDBCドライバのサンプルコードをScalaで書き換えます。

DriverManager のOracleサーバのIPアドレスは稼働するアドレスを指定します。(以下はサンプルです)

package ews.servlet

import java.io.IOException
import java.util.Date
import java.util._
import seedo.database._
import java.sql._
import oracle.jdbc._
import oracle.jdbc.pool.OracleDataSource
import java.io.PrintWriter

class db01 {
	def run(out:PrintWriter) : Unit = {
		// Oracle JDBC Driverのロード
		Class.forName("oracle.jdbc.driver.OracleDriver");
		// Oracle11g に接続
		val conn = DriverManager.getConnection("jdbc:oracle:thin:@111.111.111.111:1521:orcl11g", "scott", "tiger")
		// ステートメントを作成
		val stmt = conn.createStatement
		// 問合せの実行
		val rset = stmt.executeQuery("select EMPNO, ENAME from EMP order by ENAME")
		// 問合せ結果の表示
		out.println("<table>")
		while ( rset.next() ) {
			// 列番号による指定
			out.println("<tr><td>"+rset.getInt(1) + "</td><td>" + rset.getString(2)+"</td></tr>")
		}
		out.println("</table>")
		// 結果セットをクローズ
		rset.close
		// ステートメントをクローズ
		stmt.close
		// 接続をクローズ
		conn.close
	}
	def db : Unit = {
		// Prompt the user for connect information
		System.out.println("Please enter information to test connection to the database")
		var user = "scott"
		var password = "tiger"
		var database = "orcl11g"

		print("Connecting to the database...")
		println("Connecting...")
		// Open an OracleDataSource and get a connection
		val ods = new OracleDataSource
		ods.setURL("jdbc:oracle:thin:@111.111.111.111:1521:orcl11g");
		ods.setUser(user);
		ods.setPassword(password);
		val conn = ods.getConnection();
		println("connected.")

		// Create a statement
		val stmt = conn.createStatement

		// Do the SQL "Hello World" thing
		val rset = stmt.executeQuery("select 'Hello World' from dual")
		
		while (rset.next()){
			println(rset.getString(1))
		}
		// close the result set, the statement and the connection
		rset.close
		stmt.close
		conn.close
		println("Your JDBC installation is correct.");
	}
}



実際のHEROKUの画面はこんな感じです。

http://radiant-mountain-7703.herokuapp.com/html

ScalaでOKです。

このソースコードでの障害を1つ。

最初は、htmlSrv.scalaファイル1つだったのですが、

import java.sql._

を追加すると、

@WebServlet(Array(“/html”))

のArrayクラスが定義できないとコンパイラからエラー。

これはjava.sql._ライブラリにArrayクラスが独自に定義されていることが原因。

面倒なので、別のクラスにして逃げています。

こんなもんのです。プログラム作るってことは。

Comments

comments

Powered by Facebook Comments

コメントはまだありません

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.

Powered by WordPress