読者です 読者をやめる 読者になる 読者になる

割と普通なブログ

Microsoft Azure や ASP.NET、Java EE 系の話題を記載します

Javaを利用してSQL Azureへ接続するためのTIPS

Java Windows Azure

今回はJavaを利用してSQL Azureへ接続するためのTIPSを紹介する。「JDBC直接続」と「Hibernateを利用したO/Rマッピング」を行ったので、「Windows AzureJavaでもいけるぜ」という言葉を疑問視している方は是非一読して頂きたい。
今回取り扱うSQL Azureでは、開発者にクラウド上でもRDBを利用できる環境を提供している。同機能とWorkerロール*1を組み合わせれば、Windows Azure上でJavaで作られたCRUDなWEBアプリケーションを動作させる事も可能だ。
実際にTomcatやJettyを稼働させたサンプルがMSDN Code Gallaryに公開されているので、こちらを確認してもよいだろう。

  1. Tomcat Sample > http://code.msdn.microsoft.com/azuretomcat
  2. Jetty Sample > http://code.msdn.microsoft.com/winazurejetty

サンプルアプリケーションについて

今回作成したサンプルは以下で公開している。実際に稼働確認をしてみると、より理解が深まると思う。

修正が必要なファイルは以下の二つである(はず。。。)

SQL Azure に接続するための環境準備

  • SQL Azure にテーブル登録&レコード登録

SQL Server Management Studioを利用して、単純な「Comments」テーブルをSQL Azureに作成した。以下の画像から、「Comments」テーブルが作成され、2つのレコードが登録されていることが確認できる。

以下より、SQL ServerJDBCドライバを取得し、インストールを行う。
Microsoft SQL Server JDBC Driver 2.0

JDBCSQL Azureに直接続するためのサンプルコード

以下のコードを利用してSQL Azureに接続を行った。

  • テストコード
	@Test
	public void SQLAzureにjdbc直接続01() {
		logger.info("始まり");

		Connection conn = null; // コネクションオブジェクト
		Statement stmt = null; // ステートメントオブジェクト
		ResultSet rs = null; // 結果セットオブジェクト

		// 接続文字列作成
		StringBuilder sb = new StringBuilder();
		sb.append("jdbc:sqlserver://<★サーバ名★>.database.windows.net:1433;"); // SQL
		// Azure
		sb.append("databaseName=<★データベース名★>;"); // データベース名
		sb.append("ssl=require"); // 認証

		try {
			// SQL Server ドライバ登録
			Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

			// コネクション作成
			conn = DriverManager.getConnection(sb.toString(),
					"<★アカウント名★>@<★サーバ名★>", "<★パスワード★>");

			// SQL 文字列
			String strSQL = "SELECT * from Comments";

			// ステートメント作成・SQL実行
			stmt = conn.createStatement();
			rs = stmt.executeQuery(strSQL);

			// データを標準出力
			while (rs.next()) {
				System.out.printf("ID: %s, Name: %s, Body: %s\n", rs
						.getString("ID"), rs.getString("Name"), rs
						.getString("Body"));
			}

		} catch (Exception ex) {
			ex.printStackTrace();

		} finally {
			if (rs != null) { // 結果セットのクローズ
				try {
					rs.close();
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
			if (stmt != null) { // ステートメントのクローズ
				try {
					stmt.close();
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
			if (conn != null) { // コネクションのクローズ
				try {
					conn.close();
				} catch (Exception ex) {
					ex.printStackTrace();
				}
			}
		}
		logger.info("終わり");
	}

Hibernateを利用してSQL Azureに接続するためのサンプルコード

persistence.xmlとテストメソッドのみソースコードを記述する。エンティティのコードは従来通りであるため、割愛する。

  • persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
   http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="em" transaction-type="RESOURCE_LOCAL">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<properties>
			<property name="hibernate.connection.driver_class"
				value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.connection.url"
				value="jdbc:sqlserver://<★サーバ名★>.database.windows.net:1433;databaseName=<★データベース名★>;ssl=require" />
			<property name="hibernate.connection.username" value="<★アカウント名★>@<★サーバ名★>" />
			<property name="hibernate.connection.password" value="<★パスワード★>" />
		</properties>
	</persistence-unit>
</persistence>
  • テストコード
	@Test
	public void SQLAzureでHibernate01() throws InstantiationException,
			IllegalAccessException, ClassNotFoundException, SQLException {
		logger.info("始まり");

		EntityManagerFactory emf = Persistence.createEntityManagerFactory("em");
		EntityManager em = emf.createEntityManager();
		Comment c = em.find(Comment.class, 1);
		System.out.println(c);

		logger.info("終わり");
	}

*1:リリースされればVMロールの方が良いか?