Archive for 2月, 2010
ここから始める Java EE 6
2009年12月に Java EE 6 がリリースされて、約3ヶ月経ちました。Java EE 6 にはかなり多くの改善がみられますが、どこから始めればいいのかわからない方に、JSF2,JPA2,EJB 3.1を使ったかんたんな Java EE 6 アプリケーションの書き方を紹介します。
Java EE 6 には非常にたくさんの技術が含まれているので一度に全てを理解することは大変だと思いますが、まずはこのサンプルを通じて、JSF,JPA,EJB にどのような変更が加わったのか、またどのような点が楽になったのか等を理解して頂ければと思います。
開発/実行環境: 開発環境:NetBeans 6.8 実行環境:Oracle GlassFish Server v3 |
(上記は別途インストールしておいてください。)
サンプルアプリケーションの概要:
コードを書く前にこれから作成するサンプルアプリケーションの概要について説明します。このアプリケーションはとても簡単なアプリケーションでユーザ(データ)を登録して参照するだけという、いたってかんたんなアプリケーションです。また処理フローもとてもシンプルです。
アプリケーションの完成予想イメージは下記です。ユーザ登録画面で「作成」ボタンを押下しデータを登録した後、一覧表示画面が表示されます。また一覧表示画面中の「新規作成」のリンクを押下すると登録画面に遷移します。
1.新規プロジェクトの作成
それでは早速プロジェクトを作成していきます。今回作成するアプリケーションは、EJBを含んでいますが新規プロジェクトの作成時「Web アプリケーション」を選択して作成することにします。
補足: Java EE 6 におけるパッケージ構成の変更点を紹介します。過去の Java EE のバージョンでは下記のように EJB を ear にまとめたり、JSF/Servlet 等を war にまとめたりといったようにパッケージ構成が面倒でした。Java EE 6 からはこのようなパッケージ化の必要はなくなり、EJB も war に含めてデプロイできるようになりました。 |
それでは、メニューから「ファイル」→「新規プロジェクト(W)…」→「Java Web」→「Web アプリケーション」を選択し、「次へ>」ボタンを押下してください。
プロジェクト名に「PersonManagement」を入力し「次へ>」ボタンを押下します。
次に、「サーバと設定」で配備するアプリケーションサーバとJava EE のバージョンを選択します。ここでは、「GlassFish v3 ドメイン」と「Java EE 6 Web」を選択し「次へ>」ボタンを押下します。
次に、使用するフレームワークを選択します。今回は、「JavaServer Fcaces」を使用しますのでこれにチェックを付け「完了(F)」ボタンを押下します。
プロジェクトを作成すると下記のような画面が表示されます。
2. JPA 2.0:Entity Bean の作成
新規プロジェクトを作成後、Entity Bean を作成します。Java EE 5 から Entity CMP 2.x に代わり JPA 1.0 が登場し、DBに対する持続性のコード記述がかなり楽になりました。JPA 2.0 ではさらに扱いやすくなり、機能面でも改善が施されています。(JPA 2.0 の新機能の詳細は別途記載する予定です。また今回はとても簡単なサンプルのためJAP 2.0の新機能はあまり使用していません。JPA 1.0と同等レベルの記述内容)
それでは、実際に Entity Bean を作成してみましょう。メニューから「ファイル」→「新規ファイル(N)…」→「持続性」を選択してください。
NetBeans を利用すると既存のデータベースのテーブルから Entity クラスを自動的に生成する事ができます。既に DB テーブルを作成している場合は「データベースからのエンティティークラス」を選択して作成してください。NetBeans を使う上で、この機能は大変便利です。私も普段は先に DB のテーブルを作成して、Entity クラスは NetBeans で自動生成しますので一から Entity クラスを作成する事はあまりしません。是非お試しください。
今回、私は DB のテーブルが作成されていない状態で新規にエンティティークラスを生成しますので「エンティティークラス」を選択し「次へ>」ボタンを押下します。この方法では、エンティティークラスを先に作成した後、エンティティクラスに該当するテーブルを DB 上に後から構築します(Entity クラスを元にテーブルを自動生成することもできます)。
ここで新しいエンティティークラス名「Person」、パッケージ名「ent」を入力します。「主キー型」はこのテーブルの主キーの型を選択します。Person を ID で管理しますので、そのまま、「Long」型を設定します。
「完了(F)」ボタンを押下する前に1点注意してください。ワーニングで「プロジェクトに持続性ユニットがありません。エンティティークラスを持続さ…」というメッセージが表示されています。これはこのエンティティクラスに対する持続性ユニットが存在していない事を意味しています。そこで「持続性ユニットを作成…」ボタンを押下し、このエンティティクラスに紐づく持続性ユニットを作成します。ボタンを押下すると下記の画面が表示されます。
持続性プロバイダとして JPA 2.0 の参照実装である「EclipseLink(JPA 2.0)(デフォルト)」と、データソースを選択します。また表生成の方針ですが、「作成」を選択すると自動的に DB にテーブルを作成します。全ての入力が完了した後、最後に「作成」ボタンを押下します。
この時、後のプログラミング時に使用しますので、入力した持続性ユニット名(PersonManagementPU)を覚えておいてください。
「作成」ボタンを押下すると、「新規エンティティ作成画面」に戻ってきますが、持続性ユニットに関するワーニングが消えたことを確認した後、最後に「完了(F)」ボタンを押下してください。ボタンを押下すると入力された情報を元に ID のみを持つ Person エンティティのひな形が自動生成されます。また同時に、構成ファイル配下に、持続性ユニットの設定ファイル persistence.xmlが自動生成されます。
作成された Entity クラス(Person)のひな形を編集していきます。
ソースコードを確認すると @Entity のアノテーションが自動的に付加されている事に気づきます。このアノテーションを付加することによりコンパイラや、EJB コンテナが本クラスをエンティティクラスと解釈してくれるようになります。
名前、住所、電話番号、年齢をあつかえるようにフィールドを追加し、それぞれに対するセッタ、ゲッタメソッドを記載してください。また、@NamedQuery で JPQL を記載し、DBに登録されている全ての Person を取得できるようにします。
package ent; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.NamedQuery; @Entity @NamedQuery(name="findAllPerson", query="SELECT p FROM Person p") public class Person implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @Column(nullable=false,length=256) private String name; @Column(nullable=false,length=256) private String address1; @Column(nullable=false,length=12) private String telephone; @Column(nullable=false) private Long age; public Long getId() { return id; } public void setId(Long id) { this.id = id; } @Override public int hashCode() { int hash = 0; hash += (id != null ? id.hashCode() : 0); return hash; } @Override public boolean equals(Object object) { if (!(object instanceof Person)) { return false; } Person other = (Person) object; if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { return false; } return true; } @Override public String toString() { return "entity.Person[id=" + id + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress1() { return address1; } public void setAddress1(String address1) { this.address1 = address1; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; } public Long getAge() { return age; } public void setAge(Long age) { this.age = age; } }
以上で、このサンプルアプリケーションに必要なエンティティクラスはできました。
3.EJB 3.1:ステートレスセッション Bean の作成
エンティティクラスを生成したので、次に EJB (ステートレス・セッション Bean) を作成します。「ファイル」→「新規ファイル(N)…」→「Java EE」→「セッション Bean」を選択し、「次へ>」ボタンを押下してください。
ボタンを押下すると下記の画面が表示されます。ここで「EJB 名(N)」、「パッケージ(K)」を入力し「完了(F)」ボタンを押下します。
補足: 上記画面を確認するとローカルインタフェース、リモートインタフェースが選択できるようになっています。 EJB 3.1 からローカルインタフェースがオプション化されインタフェースを作成する必要がなくなりました。EJB 3.0 では下記の例のようにインタフェースを定義し、それを実装しなければなりませんでしたが、EJB 3.1 からはアノテーションを付加するだけでコンテナが理解してくれるようになります。 EJB 3.0 でのローカルインタフェースの実装例 実際にコードで書くと下記のようになります。 public interface Hello { public String sayHello(); } @Stateless public class HelloBean implements Hello { public String sayHello() { return "hello"; } } EJB の利用時 @EJB Hello helloRef; ... helloRef.sayHello(); これが、EJB 3.1 では下記のようにインタフェースを定義する必要はなくなります。
EJB 3.1 を利用する時のコードは下記となります。 |
それではコードを編集していきましょう。今回は、データの検索と追加を行いますので、それぞれの処理を行う2つのメソッドを実装しています。まず、@PersistenceContextのアノテーションで、(JPA Entity クラスを作成した時に作成した持続性ユニット名。persistence.xml に記載されている。)持続性ユニット名(“PersonManagementPU”)を記載します。これにより持続機能を持った EntityManager のオブジェクト(em)がセットされます。
package pejb; import ent.Person; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.Query; @Stateless public class PersonEJB { @PersistenceContext(unitName="PersonManagementPU") private EntityManager em; public List<Person> findAllPersons(){ //Entity(Person)クラスの @NamedQuery の記載に基づき検索 Query query = em.createNamedQuery("findAllPerson"); return (List<Person>) query.getResultList(); } public Person createPerson(Person person){ em.persist(person); return person; } }
4.JSF:Managed Bean の作成
EJBと、Entity を作成したので、JSF から利用する Managed Bean を作成しましょう。「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」→「JSF 管理対象 Bean」を選択し「次へ>」ボタンを押下してください。
「クラス名(N)」、「パッケージ(K)」を入力し「完了(F)」ボタンを押下します。
補足: JSF 2.0 からは下記のような faces-config.xml の設定ファイルがオプション化されました。そこで Managed Bean の設定や画面遷移を XML ファイルに記載する必要はなく、アノテーションを利用しプログラム上で実現することができるようになりました。 JSF1.2 までの faces-confg.xml の設定例:
|
コードを編集していきましょう。作成するクラスが Managed Bean であることをコンテナに理解させるため、@ManagedBean のアノテーションを利用します。アノテーションを指定する際、”name” 属性は必須で Managed Bean を識別する名前を入力します。
package mbean; import ent.Person; import pejb.PersonEJB; import java.util.ArrayList; import java.util.List; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.ejb.EJB; @ManagedBean(name="PersonController") @RequestScoped public class PersonController { public PersonController() { } @EJB private PersonEJB personEJB; private Person person = new Person(); private List<Person> personList = new ArrayList<Person>(); //Facelets の action="#{PersonController.doNew} により画面遷移 public String doNew(){ return "createPerson.xhtml"; } //Facelets の action="#{PersonController.doCreatePerson} により画面遷移 public String doCreatePerson(){ //画面から入力された Person を DB に登録 setPerson(personEJB.createPerson(getPerson())); //DB に登録されている全 Person を personList に設定 setPersonList(personEJB.findAllPersons()); return "listPersons.xhtml"; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public List<Person> getPersonList() { return personList; } public void setPersonList(List<Person> personList) { this.personList = personList; } }
5.JSF 2.0: ベージの作成
最後に、表示画面を作成します。JSF 2.0 から facelet を xhtml で記載できるようになりました。
「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」を選択し「次へ>」ボタンを
押下してください。
ファイル名 (createPerson.xhtml) を入力すると自動的に .xhtml の拡張子が付加されます、最後に「完了(F)」ボタンを押下します。
自動生成されたひな形を編集して下記のコードを記載してください。Facelets で扱えるタグ等は別途紹介する予定ですが、みていただければわかるとおり、HTML も記載する事ができますし、スタイルシート等を記載することも可能です。また、JSF 2.0 から Ajax をサポートしていますので、Ajax のコードを利用してサーバと通信する事もできるようになります。
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:form> <table> <tr> <td> <h:outputLabel value="名前:"/> </td> <td> <h:inputText value="#{PersonController.person.name}"/> </td> </tr> <tr> <td> <h:outputLabel value="住所"/> </td> <td> <h:inputText value="#{PersonController.person.address1}"/> </td> </tr> <tr> <td> <h:outputLabel value="電話番号"/> </td> <td> <h:inputText value="#{PersonController.person.telephone}"/> </td> </tr> <tr> <td> <h:outputLabel value="年齢"/> </td> <td> <h:inputText value="#{PersonController.person.age}"/> </td> </tr> </table> <h:commandButton value="作成" action="#{PersonController.doCreatePerson}"/> </h:form> </h:body> </html>
最後に、登録された一覧を表示する画面を作成します。
「ファイル」→「新規ファイル(N)…」→「JavaServer Faces」を選択し「次へ>」ボタンを
押下してください。
ファイル名(listPersons)を入力し「完了(F)」ボタンを押下します。
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"> <h:head> <title>Facelet Title</title> </h:head> <h:body> <h:dataTable value="#{PersonController.personList}" var="psn" border="1"> <h:column> <f:facet name="header"> <h:outputText value="名前"/> </f:facet> <h:outputText value="#{psn.name}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="住所"/> </f:facet> <h:outputText value="#{psn.address1}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="電話番号"/> </f:facet> <h:outputText value="#{psn.telephone}"/> </h:column> <h:column> <f:facet name="header"> <h:outputText value="年齢"/> </f:facet> <h:outputText value="#{psn.age}"/> </h:column> </h:dataTable> <h:form> <h:commandLink action="#{PersonController.doNew}"> 新規作成</h:commandLink> </h:form> </h:body> </html>
以上で、このアプリケーションの実装は完了です。
NetBeans のメニューより「実行(R)」→「主プロジェクトを実行(R)」を選択してください。実行すると自動的にブラウザがオープンしアプリケーションのデフォルトのコンテンツが表示されます。
コンテキストルートでアクセスされた時のデフォルトページを変更したい場合は、web.xml ファイルを編集する必要があります。下記のように welcome-file-list を編集してください。
web.xml の編集
<welcome-file-list> <welcome-file>faces/createPerson.xhtml</welcome-file> </welcome-file-list> |
設定を変更した後、もう一度プロジェクトを実行してください。すると下記のように自動的に登録画面が表示されるようになります。
データを入力して「作成」ボタンを押下してみましょう。下記のように一覧表示画面が表示されれば問題はありません。
最後に、エラーハンドリングについて紹介します。例外が発生した際に特定のエラーページにリダイレクトさせるようにweb.xml の<error-page> タグを記載する必要があります。<exception-type>で、ハンドリングした例外毎にエラーページを表示させる事が可能です。本番環境においては、少なくとも JSF で発生する例外の親である javax.servlet.ServletException を記載してください。
web.xml の編集
<error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/error.xhtml</location> </error-page> |
以上で、今回の Java EE 6 のアプリケーション作成は終了です。NetBeans を利用するとウィザードを使って、コードのひな形を作成してくれたり、また設定も極力 XML ファイルを手動で編集しなくても済むようになります。是非お試しください。今回紹介したサンプルは Java EE 6 を利用する上で最も基本的な構成と思います、上記の例を元に色々と修正を加え、DI/CDI や Bean Validation 等を加えて Java EE 6 の機能を是非色々と試してみてください。
最後に、私の環境で作成したNetBeans 6.8 のプロジェクトを下記から入手できるようにしました。
(※ Sun の mediacast.sun.com サイトにファイルをアップロードしていますので、
仮にこのサイトが閉鎖してしまった場合は申し訳ありませんがご了承ください。)
● NetBeans 6.8 のプロジェクト(ソース、設定ファイル等を含む)
● GlassFish v3 配備用 WARファイル
今日も関東地方は雪
関東地方は朝から雪が降っていますね。
今日からDevelopers Summit 2010が開催されるので、参加者に影響がなければいいですね。
私も登録してあるので、仕事で時間ができれば伺いたいと思っています。
発表者の方々是非頑張ってください。
河津桜まつり
昨日、日曜日に河津桜まつりに日帰りで行ってきました。
河津は一昨年に続き2回目となるのですが、昨日の時点では全体的に、まだツボミも多く、5分〜7分咲きといった所ではなかったでしょうか。次の土・日曜日辺りが満開になるのではないかと思いますのでご興味のある方は行ってみてください。いくつか写真を撮ってきました。

河津桜まつり

河津桜まつり
河津桜まつり
行きは沼津経由で行き、帰りは箱根経由で戻って来たのですが、いずれも山には結構雪が積もっていました(運転手だったので雪を写真におさめれなかったのですが)。特に箱根の頂上辺りは極寒で、車の温度計が−2℃(夕方5時頃)を指していました、山の上はまだまだ真冬なのに、同じ日に春の象徴の桜もみれて、ギャップを楽しむことができた一日でした。

バンビ
昨日は妻の実家で飼っているバンビも連れていったのですが、、今回はなかなか良い顔をしてくれませんでした。ちなみにこれ獲物(お菓子)を狙う目です。下はごちそうさまの顔。

バンビ
Oracle + Sun Welcome イベントが東京、大阪で開催
Oracle + Sun Welcome Event が世界各国で開催されることが決まったようです。
各国の開催予定日はここに記載されています。
ちなみに、日本では東京と大阪で、それぞれ 4月21日、4月22日 に開催されるようです。
どうぞお楽しみに。
プレゼンスタイルについて
私は仕事がら社内外でプレゼンをする機会が多いのですが、プレゼンを行った後、ご来場頂いた皆様に書いて頂いたアンケートを必ず見るようにしています。というのも頂いたアンケート結果を元に次回のプレゼンに何とか生かせないかと考えているためです。
そんな、アンケートの内容を確認するとたまにプレゼンの仕方について
記載して頂くことがあります。
(同僚からは寺田のプレゼンは「熱い!!」と言われています。)
そこで、今日は私のプレゼンに対する取り組みと注意しているポイントについてまとめてみたいと思います。
さて、
- プレゼンを行う際に皆様どのような事に気をつけていますか?
- もしくはどのようにプレゼンしたいと思いますか?
私がプレゼンで一番重要にしているポイントは「情熱」です。
自分が紹介する情報に対して如何に情熱を持って話ができるか、それが何よりも重要だと思っています。だから熱いと言われるのも仕方がないのですが。しかし 自分が良いと思ってもない事、自分自身が信じていない事に対していくら良いですよ、聞いてくださいねと話をしても聞き手には全く伝わりません。
ですので伝えたい内容に関して、この自分が信じて止まない情報を是非聞いていただきたい、もっと広めたいと思って説明をするようにしています。
これを実現するためには、必ず自分のプレゼン資料は自分で作るようにしています。それは当然では?と思われる方も多いかと思うのですが、企業に勤めて製品 説明等を行う際、別の誰かが作成したプレゼン資料を使い回して説明しなければならない事もあります。実際過去に世界各国で共通のプレゼンを使用して、それ ぞれ別の人が発表するといった事があったわけですが、そのような場合も必ず自分で手を加えるようにしました。
なぜなら、そのプレゼン資料を作成した人と私の重要ポイントは違うためです。仮に発表用の原稿が用意されていて、強調ポイントまでが指し示されているので あれば、同じ資料を使用して同じプレゼンをする事もできるかもしれませんが、それでは自分がプレゼンをする意味がありません。
私が聞いて欲しいと思うポイントを強調したり、新たに原稿を追加する等して
カスタマイズする事によって自分のプレゼンに仕上がります。
実際に、プレゼン資料を作成する際に注意する点は下記です。
全体構成に関する注意点
- 概要説明から詳細説明へ
- かんたんな内容から難しい内容へ
- ページ間にストーリを作成
ページ作成時の注意点
- 文字を多用しない
- 伝えたいポイントのみ記載する
- 自分の口頭の説明に対する補助を記載する
- 説明する内容の概要のみ把握(詳細は必要なし)
上記で、”説明する内容の概要のみ把握”と記載していますが、これは、私が重視するポイントの一つです。最初は各ページで説明する内容をまとめた発表用原稿を用意していましたが今は原稿を作成することはまずありません。
各ページの作成時に覚えておくべき事は、このページでは何を説明すべきか、という事だけです。仮に忘れそうであればプレゼン資料内に補助で説明文言を含めれば忘れることもなくなるので、基本的には発表内容を一言一句全て覚えるということはしません。
発表内容を完全に覚えた場合のワーストケースとして下記のような事が発生する可能性があります
- 発表時間が突然変わることがある。
- 緊張して上がった場合に頭が真っ白になる。
説明する内容の概要さえ覚えておけば上記を防ぐことができます。例えば、発表時間に応じて内容を柔軟に修正できるため時計をみながら発表内容を短縮もしくは拡張することができるようになります。
また仮に緊張して上がっても発表する内容の概要だけが頭に残っていれば、(仮に残っていなくてもページの文章を読めば)最悪な停止状態はさけられ、そこを乗り越えれば時間を経過するにつれて落ち着いてくるので普段とおりの発表ができるようになります。
一言一句覚えてしまうと柔軟な対応ができなくなってしまいます。
また、発表時に気をつけるポイントとしては下記があります。
- 声は大きくはっきりと
- ポイントを指す時以外はできる限りプレゼン資料は見ない
- 常に聞き手に対して正面を向くようにする
- 相づちを打ってくださる数名のお客様を見つけその方達に語りかけるように説明する
- テーブル等がある場合は、テーブルに隠れないようにし体全体が見えるようにする
- お客様のリストの事前確認、もしくは発表中のお客様の反応を見て、興味のありそうなポイントを通常より詳しく説明する。
- デモンストレーションを行う場合は事前にデモ内容を録画した動画ファイルを準備しておく
以上、私がプレゼンで注意しているポイントです。プレゼンスタイルは人それぞれだと思いますし手法も色々あるのですが少しでも参考になれば幸いです。
最後に余談ですが、こうやって改めて自分のプレゼンについて考えてみて自分のプレゼンスタイルのルーツを思い出すことができました。学生時代にあ る国際学会で出会った外人さんなのですが、彼のプレゼンがとてもすばらしく最初は彼の真似をしたのではないかと思います。もちろん、その後社会人になって 色々な方にプレゼンのアドバイスを頂いたり書籍などからも学んだのですが、ルーツはそこなんだなと思いだしました。
皆さんも記憶に残るプレゼンってありますか?
GlassFish データベースの設定
GlassFishはデータベースとの接続にデータベースベンダーが提供するJDBCドライバを使用します.
GlassFishにはインストール時デフォルトで Java DBが付属しており,あらかじめJava DBに対するJDBCリソースと接続プールの設定がされています.そして GlassFish の監視系の機能の一つである,「呼び出しフロー」のデータ保存先として使用されています.
ここでは,新たにMySQL 5.1との接続設定方法について紹介します.MySQLと接続するためには,MySQLのJDBCドライバを事前に入手しておいてください.
また以降の手順ではMySQLが既にインストールされていることを前提に説明します.
JDBCドライバに対するクラスパスを設定
dashost > asadmin get “cluster1-config.java-config.server-classpath” cluster1-config.java-config.server-classpath = dashost > asadmin set “cluster1-config.java-config.server-classpath=/sun/glassfish-v2.1.1/lib/mysql-connector-java-5.1.5-bin.jar” cluster1-config.java-config.server-classpath = /sun/glassfish-v2.1.1/lib/mysql-connector-java-5.1.5-bin.jar |
クラスパスの設定は,管理コンソールから左ペインの「設定」→「対象のコンフィグ(cluster1-config)」→「JVM 設定」を選択し右ペインの「サーバクラスパス」内に記載し設定できます.
次に JDBC の接続プールを作成します.
dashost > asadmin create-jdbc-connection-pool –datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource –restype=javax.sql.DataSource –property user=root:password=password:DatabaseName=MySQL:ServerName=localhost:port=3306:URL=”jdbc\:mysql\://localhost\:3306/test” MySQL-Pool コマンド create-jdbc-connection-pool は正常に実行されました。 |
分散トランザクションが必要な場合,リソースタイプ,データソースにそれぞれ下記を使用してください.
javax.sql.XADataSource
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
管理コンソールからは下記の手順に従い設定してください.
まず、左ペインの「リソース」→「JDBC」→ 「接続プール」を選択し右ペインの「新規 …」ボタンを押下します.
次に,「接続プール名」,「リソースタイプ」,「データベースベンダー」を選択し「次へ」ボタンを押下します.
最後に,JDBC の各種詳細な設定項目を選択/入力し「完了」ボタンを押下します.
JDBCドライバ等の設定項目一覧が数多くリストされますが,ここでは最低限下記の項目のみ編集して設定を完了します.
名前 | 値 |
user | root |
password | password |
DatabaseName | MySQL |
ServerName | localhost |
port | 3306 |
URL | jdbc:mysql://localhost:3306/test |
「完了」ボタンを押下すると下記の画面が表示されます.
ここで、作成した JDBC 接続プールが有効か否か疎通確認を行います.
成功時:
dashost > asadmin ping-connection-pool MySQL-Pool コマンド ping-connection-pool は正常に実行されました。 |
失敗時:
dashost > asadmin ping-connection-pool MySQL-Pool com.mysql.jdbc.exceptions.jdbc4.CommunicationsException CLI137 コマンド ping-connection-pool は失敗しました。 |
また,管理コンソールから左ペインの「リソース」→「 JDBC」→「 接続プール」より対象の接続プールを選択し「Ping」ボタンを押下し確認できます.
成功時:
失敗時:
次に、作成した JDBC 接続プールに対して,リソース設定を行います.
アプリケーションはここで設定する JNDI 名を利用して DB にアクセスできるようになります.
dashost > asadmin create-jdbc-resource –connectionpoolid MySQL-Pool jdbc/mysql コマンド create-jdbc-resource は正常に実行されました。 |
管理コンソールからは下記の手順に従い設定してください.
まず、左ペインの「リソース」→「JDBC」→ 「 JDBCリソース」を選択し右ペインより「新規 …」ボタンを押下します.
続いて,「JNDI 名」,「プール名」,有効状態のチェックをつけ「利用可能なターゲット」に対象のクラスタ(cluster1)を追加して「了解」ボタンを押下します.
「了解」ボタンを押下すると下記の画面が表示され JDBC リソースの設定は完了します.以降アプリケーションはここで設定した “jdbc/mysql” を利用して DB
に対して接続ができるようになります.
DBの設定情報の取得
ここで,DB の設定可能な項目の一覧をリストしてみます.asadmin の get コマンドを実行して確認ができます.各設定項目は asadmin set コマンドで設定変更を更新できますので必要に応じて設定変更を行ってください.
dashost > asadmin get “domain.resources.jdbc-connection-pool.MySQL-Pool.*” domain.resources.jdbc-connection-pool.MySQL-Pool.allow-non-component-callers = false domain.resources.jdbc-connection-pool.MySQL-Pool.associate-with-thread = false domain.resources.jdbc-connection-pool.MySQL-Pool.connection-creation-retry-attempts = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.connection-creation-retry-interval-in-seconds = 10 domain.resources.jdbc-connection-pool.MySQL-Pool.connection-leak-reclaim = false domain.resources.jdbc-connection-pool.MySQL-Pool.connection-leak-timeout-in-seconds = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.connection-validation-method = auto-commit domain.resources.jdbc-connection-pool.MySQL-Pool.datasource-classname = com.mysql.jdbc.jdbc2.optional.MysqlDataSource domain.resources.jdbc-connection-pool.MySQL-Pool.description = domain.resources.jdbc-connection-pool.MySQL-Pool.fail-all-connections = false domain.resources.jdbc-connection-pool.MySQL-Pool.idle-timeout-in-seconds = 300 domain.resources.jdbc-connection-pool.MySQL-Pool.is-connection-validation-required = false domain.resources.jdbc-connection-pool.MySQL-Pool.is-isolation-level-guaranteed = false domain.resources.jdbc-connection-pool.MySQL-Pool.lazy-connection-association = false domain.resources.jdbc-connection-pool.MySQL-Pool.lazy-connection-enlistment = false domain.resources.jdbc-connection-pool.MySQL-Pool.match-connections = false domain.resources.jdbc-connection-pool.MySQL-Pool.max-connection-usage-count = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.max-pool-size = 32 domain.resources.jdbc-connection-pool.MySQL-Pool.max-wait-time-in-millis = 60000 domain.resources.jdbc-connection-pool.MySQL-Pool.name = MySQL-Pool domain.resources.jdbc-connection-pool.MySQL-Pool.non-transactional-connections = false domain.resources.jdbc-connection-pool.MySQL-Pool.pool-resize-quantity = 2 domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowLoadLocalInfile = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowMultiQueries = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowNanAndInf = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowUrlInLocalInfile = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AlwaysSendSetIsolation = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoClosePStmtStreams = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoDeserialize = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoGenerateTestcaseScript = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoReconnectForPools = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoSlowLog = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.BlobSendChunkSize = 1048576 domain.resources.jdbc-connection-pool.MySQL-Pool.property.BlobsAreStrings = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheCallableStatements = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheCallableStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CachePrepStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CachePreparedStatements = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheResultSetMetadata = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheServerConfiguration = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CallableStatementCacheSize = 100 domain.resources.jdbc-connection-pool.MySQL-Pool.property.CallableStmtCacheSize = 100 domain.resources.jdbc-connection-pool.MySQL-Pool.property.CapitalizeTypeNames = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ClientInfoProvider = com.mysql.jdbc.JDBC4CommentClientInfoProvider domain.resources.jdbc-connection-pool.MySQL-Pool.property.ClobberStreamingResults = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ConnectTimeout = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ContinueBatchOnError = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.CreateDatabaseIfNotExist = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DatabaseName = MySQL domain.resources.jdbc-connection-pool.MySQL-Pool.property.DefaultFetchSize = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.DontTrackOpenResources = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DumpMetadataOnColumnNotFound = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DumpQueriesOnException = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DynamicCalendars = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ElideSetAutoCommits = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.EmptyStringsConvertToZero = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.EmulateLocators = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.EmulateUnsupportedPstmts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.EnablePacketDebug = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.EnableQueryTimeouts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ExplainSlowQueries = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.FailOverReadOnly = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.FunctionsNeverReturnBlobs = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.GatherPerfMetrics = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.GatherPerformanceMetrics = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.GenerateSimpleParameterMetadata = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.HoldResultsOpenOverStatementClose = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.IgnoreNonTxTables = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.IncludeInnodbStatusInDeadlockExceptions = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.InitialTimeout = 2 domain.resources.jdbc-connection-pool.MySQL-Pool.property.InteractiveClient = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.IsInteractiveClient = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.JdbcCompliantTruncation = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.JdbcCompliantTruncationForReads = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.LoadBalanceStrategy = random domain.resources.jdbc-connection-pool.MySQL-Pool.property.LocatorFetchBufferSize = 1048576 domain.resources.jdbc-connection-pool.MySQL-Pool.property.LogSlowQueries = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.LogXaCommands = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Logger = com.mysql.jdbc.log.StandardLogger domain.resources.jdbc-connection-pool.MySQL-Pool.property.LoggerClassName = com.mysql.jdbc.log.StandardLogger domain.resources.jdbc-connection-pool.MySQL-Pool.property.LoginTimeout = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaintainTimeStats = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaxQuerySizeToLog = 2048 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaxReconnects = 3 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaxRows = -1 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MetadataCacheSize = 50 domain.resources.jdbc-connection-pool.MySQL-Pool.property.NetTimeoutForStreamingResults = 600 domain.resources.jdbc-connection-pool.MySQL-Pool.property.NoAccessToProcedureBodies = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.NoDatetimeStringSync = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.NoTimezoneConversionForTimeType = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.NullCatalogMeansCurrent = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.NullNamePatternMatchesAll = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.OverrideSupportsIntegrityEnhancementFacility = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.PacketDebugBufferSize = 20 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PadCharsWithSpace = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Paranoid = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Password = password domain.resources.jdbc-connection-pool.MySQL-Pool.property.Pedantic = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.PinGlobalTxToPhysicalConnection = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.PopulateInsertRowWithDefaultValues = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Port = 3306 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PortNumber = 3306 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PrepStmtCacheSize = 25 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PrepStmtCacheSqlLimit = 256 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PreparedStatementCacheSize = 25 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PreparedStatementCacheSqlLimit = 256 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ProcessEscapeCodesForPrepStmts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ProfileSQL = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ProfileSql = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.QueriesBeforeRetryMaster = 50 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ReconnectAtTxEnd = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.RelaxAutoCommit = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ReportMetricsIntervalMillis = 30000 domain.resources.jdbc-connection-pool.MySQL-Pool.property.RequireSSL = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ResultSetSizeThreshold = 100 domain.resources.jdbc-connection-pool.MySQL-Pool.property.RewriteBatchedStatements = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.RollbackOnPooledClose = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.RoundRobinLoadBalance = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.RunningCTS13 = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.SecondsBeforeRetryMaster = 30 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ServerName = localhost domain.resources.jdbc-connection-pool.MySQL-Pool.property.SlowQueryThresholdMillis = 2000 domain.resources.jdbc-connection-pool.MySQL-Pool.property.SlowQueryThresholdNanos = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.SocketFactory = com.mysql.jdbc.StandardSocketFactory domain.resources.jdbc-connection-pool.MySQL-Pool.property.SocketFactoryClassName = com.mysql.jdbc.StandardSocketFactory domain.resources.jdbc-connection-pool.MySQL-Pool.property.SocketTimeout = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.StrictFloatingPoint = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.StrictUpdates = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpKeepAlive = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpNoDelay = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpRcvBuf = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpSndBuf = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpTrafficClass = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.TinyInt1isBit = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TraceProtocol = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.TransformedBitIsBoolean = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.TreatUtilDateAsTimestamp = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.URL = jdbc:mysql://:3306/ domain.resources.jdbc-connection-pool.MySQL-Pool.property.UltraDevHack = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Url = jdbc:mysql://localhost:3306/test domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseBlobToStoreUTF8OutsideBMP = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseCompression = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseCursorFetch = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseDirectRowUnpack = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseDynamicCharsetInfo = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseFastDateParsing = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseFastIntParsing = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseGmtMillisForDatetimes = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseHostsInPrivileges = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseInformationSchema = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseJDBCCompliantTimezoneShift = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseJvmCharsetConverters = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseLocalSessionState = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseNanosForElapsedTime = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseOldAliasMetadataBehavior = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseOldUTF8Behavior = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseOnlyServerErrorMessages = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseReadAheadInput = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseSSL = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseSSPSCompatibleTimezoneShift = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseServerPrepStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseServerPreparedStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseSqlStateCodes = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseStreamLengthsInPrepStmts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseTimezone = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUltraDevWorkAround = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUnbufferedInput = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUnicode = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUsageAdvisor = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.User = root domain.resources.jdbc-connection-pool.MySQL-Pool.property.YearIsDateType = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ZeroDateTimeBehavior = exception domain.resources.jdbc-connection-pool.MySQL-Pool.res-type = javax.sql.DataSource domain.resources.jdbc-connection-pool.MySQL-Pool.statement-timeout-in-seconds = -1 domain.resources.jdbc-connection-pool.MySQL-Pool.steady-pool-size = 8 domain.resources.jdbc-connection-pool.MySQL-Pool.transaction-isolation-level = domain.resources.jdbc-connection-pool.MySQL-Pool.validate-atmost-once-period-in-seconds = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.validation-table-name = domain.resources.jdbc-connection-pool.MySQL-Pool.wrap-jdbc-objects = false |
コネックションプールのモニタリング
最後に、JDBC の接続プールに対してモニタリングの設定を行う方法を紹介します.モニタリングを有効にするために下記の手順に従い設定を行い,確認してください.
dashost > asadmin list “*monitor*” server.monitoring-service server.monitoring-service.module-monitoring-levels dashost > asadmin set “server.monitoring-service.module-monitoring-levels.jdbc-connection-pool=HIGH” server.monitoring-service.module-monitoring-levels.jdbc-connection-pool = HIGH dashost > asadmin get “server.monitoring-service.module-monitoring-levels.*” server.monitoring-service.module-monitoring-levels.connector-connection-pool = OFF server.monitoring-service.module-monitoring-levels.connector-service = OFF server.monitoring-service.module-monitoring-levels.ejb-container = OFF server.monitoring-service.module-monitoring-levels.http-service = OFF server.monitoring-service.module-monitoring-levels.jdbc-connection-pool = HIGH server.monitoring-service.module-monitoring-levels.jms-service = OFF server.monitoring-service.module-monitoring-levels.jvm = OFF server.monitoring-service.module-monitoring-levels.orb = OFF server.monitoring-service.module-monitoring-levels.thread-pool = OFF server.monitoring-service.module-monitoring-levels.transaction-service = OFF server.monitoring-service.module-monitoring-levels.web-container = OFF dashost > asadmin list –monitor=true “*MySQL*” server.resources.MySQL-Pool dashost > asadmin get –monitor=true “server.resources.MySQL-Pool.*” |