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

kagamihogeの日記

kagamihogeの日記です。

WildFly 8.0.0.Alpha4でOracle 11g XEのデータソースを追加する

Java JBoss Oracle

管理コンソールを使用してデータソースの定義を行う手順。

やったこと

JDBCドライバのデプロイ

ojdbc6.jarを%WILDFLY_ROOT%standalone\deploymentsに配置する。

JBossを起動する。下記のように、ojdbc6.jarがデプロイされればOK


JBAS015876: Starting deployment of "ojdbc6.jar" (runtime-name: "ojdbc6.jar")
JBAS017100: Listening on 127.0.0.1:9999
JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
JBAS010403: Deploying JDBC-compliant driver class oracle.jdbc.OracleDriver (version 11.2)
JBAS010417: Started Driver service with driver-name = ojdbc6.jar
JBAS018559: Deployed "ojdbc6.jar" (runtime-name : "ojdbc6.jar")

管理ユーザの作成

管理コンソールで作業するための管理者ユーザを作成する。

下記のように、%WILDFLY_ROOT%\bin\add-user.batを実行して作成する。何箇所から入力を求められるので、その点は後述。

>add-user.bat

What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a):

Enter the details of the new user to add.
Realm (ManagementRealm) :
Username : kagamihoge
Password :
Re-enter Password :
What groups do you want this user to belong to? (Please enter a comma separated
list, or leave blank for none)[  ]:
About to add user 'kagamihoge' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'kagamihoge' to file 'C:\Java\jboss-as\wildfly-8.0.0.Alpha4_ora\stand
alone\configuration\mgmt-users.properties'
Added user 'kagamihoge' to file 'C:\Java\jboss-as\wildfly-8.0.0.Alpha4_ora\domai
n\configuration\mgmt-users.properties'
Added user 'kagamihoge' with groups  to file 'C:\Java\jboss-as\wildfly-8.0.0.Alp
ha4_ora\standalone\configuration\mgmt-groups.properties'
Added user 'kagamihoge' with groups  to file 'C:\Java\jboss-as\wildfly-8.0.0.Alp
ha4_ora\domain\configuration\mgmt-groups.properties'
Is this new user going to be used for one AS process to connect to another AS pr
ocess?
e.g. for a slave host controller connecting to the master or for a Remoting conn
ection for server to server EJB calls.
yes/no? yes
To represent the user add the following to the server-identities definition <sec
ret value="YWFhYXNzc3MxXw==" />
続行するには何かキーを押してください . . .

管理者ユーザ(a)かアプリケーションユーザ(b)かを選択する。デフォルト(=何も入力しない)は(a)なのでコレを選ぶ。

(a):

ユーザID。任意のもの。

Username : kagamihoge

パスワードと入力確認。英数字記号必須。

Password :
Re-enter Password :

所属グループ。とりあえず何も入力せずエンターでOK

What groups do you want this user to belong to? (Please enter a comma separated
list, or leave blank for none)[  ]:

実行確認がされる。よければyesと入力。

Is this correct yes/no? yes

新しいユーザがASのプロセスから別のプロセスに接続できてもよいか? とかなんとか。たとえばEJBのリモートコールがうんぬんとかなんとか*1だが、とりあえず関係ないのでyesにしてしまう。

Is this new user going to be used for one AS process to connect to another AS pr
ocess?
e.g. for a slave host controller connecting to the master or for a Remoting conn
ection for server to server EJB calls.
yes/no? yes
Administration ConsoleからJDBC Datasourceを追加

http://localhost:8080/console にブラウザからアクセスし、さっき作ったユーザIDでログインする。とりあえずこんな感じの画面が表示される。

左上のProfile -> 左側ツリーのSubsystems -> Connector -> Datasources を選択する。デフォルトで入っているH2のデータソース(ExampleDS)が見て取れる。

Addを押す。新規データソースの名前と、JNDI名を入力する。とりあえず、ここではOracle11gXEDSとjava:jboss/datasources/Oracle11gXEDSにしておく。

JDBCドライバを選択する。さっきデプロイしたojdbc6.jarをクリックして選択状態にしてNext押す。

JDBC URL、ID、パスワードなど接続設定を入力する。

入力し終わると、こんな感じにリストに追加される。ただし、Enableの欄が使用不可になっているとおり、使うことは出来ない。ので、追加したデータソースを選択して表の右上にあるEnableを押す。

確認ダイアログが出るので実行する。

最後に、接続確認をする。ページ下部のConnectionタブを開いてTest Connectionを押す。問題が無ければ、下図のようにJDBCのConnectionが作成できましたよ、とメッセージが出る。なお、なんかエラーがあった場合はWildflyのログに出る。ex. パスワードが違ってます、とか。

接続確認

テキトーなサーブレットでも作ってみてJavaから接続確認をする。

とりあえず新しい感じのservletのdependencyを追加する。

<dependency>
    <groupId>org.jboss.spec.javax.servlet</groupId>
    <artifactId>jboss-servlet-api_3.1_spec</artifactId>
    <version>1.0.0.Beta1</version>
</dependency>

適当な感じのJavaを書く。フツーはJava EEだとJPA経由になると思うんで、DataSourceからConnection取得とかやらないとは思うけど。まぁ実験ということで。

package kagamihoge.jboss8ora;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

@WebServlet("/hoge")
public class HogeServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        try {
            Context ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:jboss/datasources/Oracle11gXEDS");
            try (Connection connection = ds.getConnection();
                    PreparedStatement sql = connection.prepareStatement("select * from v$version");
                    ResultSet r = sql.executeQuery();) {
                while (r.next()) {
                    String banner = r.getString(1);
                    System.out.println(banner);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } catch (NamingException e) {
            e.printStackTrace();
        }
    }
}

ログにSQLの実行結果が表示されれればOK

*1:良く理解していない