JAVA初心者による記録です。
幾度かresinを利用したMYSQLにアクセスるjavaプログラムを作成したが、パソコンの内臓ディスク障害により情報が紛失した。
思い出しながら、resinインストールから動作確認、JDBC設定、MYSQLへのアクセスまでの一連の作業を記載する。
resinをインストールする。
ソースファイルをダウンロードする。
https://caucho.com/products/resin/downloadからソースファイルをダウンロードする。
無料版をダウンロードする。
resin-4.0.66.tar.gzはmakeが失敗するので、新しいバージョンをダウンロードする必要がある。
configureが失敗した。
以下のエラーになったらjavaの開発パッケージ(devel)がインストールされていないのでインストールしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# tar xvfz resin-4.0.67.tar.gz resin-4.0.67/automake/ resin-4.0.67/compat/ resin-4.0.67/conf/ resin-4.0.67/conf/sample/ resin-4.0.67/contrib/ : resin-4.0.67/win32/resinssl.dll resin-4.0.67/win64/isapi_srun.dll resin-4.0.67/win64/resin_os.dll resin-4.0.67/win64/resinssl.dll # # cd resin-4.0.67 # ./configure --prefix=/usr/local/resin --enable-64bit --enable-ssl checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu : checking if /usr/bin/cp accepts -u... yes configure: error: *** Can't find JNI directory in JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64/bin *** JNI is expected in /usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64/bin/include/linux # |
インストールされているjavaパッケージを確認する。
やはりjava-17-openjdk-develがインストールされていない。
1 2 3 4 5 6 7 |
# rpm -aq | grep ^java javapackages-filesystem-6.0.0-7.el9_5.noarch javapackages-tools-6.0.0-7.el9_5.noarch java-17-openjdk-headless-17.0.14.0.7-2.el9.x86_64 java-17-openjdk-17.0.14.0.7-2.el9.x86_64 java-kolabformat-1.2.0-12.el9.x86_64 # |
java-17-openjdk-develをインストールする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# yum -y install java-17-openjdk-devel メタデータの期限切れの最終確認: 2:45:43 前の 2025年03月08日 06時45分18秒 に実施しました。 依存関係が解決しました。 =================================================================================================================================== パッケージ アーキテクチャー バージョン リポジトリー サイズ =================================================================================================================================== インストール: java-17-openjdk-devel x86_64 1:17.0.14.0.7-2.el9 devel 4.7 M トランザクションの概要 =================================================================================================================================== インストール 1 パッケージ ダウンロードサイズの合計: 4.7 M インストール後のサイズ: 8.9 M パッケージのダウンロード: java-17-openjdk-devel-17.0.14.0.7-2.el9.x86_64.rpm 6.2 MB/s | 4.7 MB 00:00 ----------------------------------------------------------------------------------------------------------------------------------- 合計 3.3 MB/s | 4.7 MB 00:01 トランザクションを確認しています トランザクションの確認に成功しました。 トランザクションをテストしています トランザクションのテストに成功しました。 トランザクションを実行しています 準備中 : 1/1 インストール中 : java-17-openjdk-devel-1:17.0.14.0.7-2.el9.x86_64 1/1 scriptletの実行中: java-17-openjdk-devel-1:17.0.14.0.7-2.el9.x86_64 1/1 検証中 : java-17-openjdk-devel-1:17.0.14.0.7-2.el9.x86_64 1/1 インストール済み: java-17-openjdk-devel-1:17.0.14.0.7-2.el9.x86_64 完了しました! # |
configureとmakeとinstallを実行する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 |
# ./configure --prefix=/usr/local/resin --enable-64bit --enable-ssl checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu checking target system type... x86_64-pc-linux-gnu : config.status: creating bin/resinctl config.status: executing depfiles commands config.status: executing libtool commands Resin Configuration Summary: RESIN : 4.0.67 home : /usr/local/resin root : /usr/local/resin conf : /usr/local/resin/conf log : /usr/local/resin/log plugins : common resin_os init : /etc/rc.d JAVA_HOME : /usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64 JNI : 64-bit include : -I/usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64/include -I/usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64/include/linux CFLAGS : cflags_shlib : -fpic ld_shlib : gcc ldflags_shlib : -shared -fPIC -m64 libs_shlib : epoll() for keepalives # # make make[1]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src' に入ります for dir in common resin_os ; do (cd $dir; make); done make[2]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src/common' に入ります gcc -c -I/usr/include -g -O2 -DEPOLL -D_POSIX_PTHREAD_SEMANTICS -DB64 -pthread -fPIC -fno-omit-frame-pointer -O2 -DHAS_SOCK_TIMEOUT -DHAS_SENDFILE -DHAS_SPLICE -DPOLL -DHAS_JVMTI -fpic stream.c : gcc -shared -fPIC -m64 -o libresin_os.so boot.o java.o jni_os.o jni_jvmti.o jni_socket.o memory.o std.o -lpthread -lrt -lc make[2]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src/resin_os' から出ます make[1]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src' から出ます # # make install make[1]: ディレクトリ '/usr/local/src/resin/resin-4.0.67' に入ります make[1]: 'install-exec-am' に対して行うべき事はありません. make[1]: 'install-data-am' に対して行うべき事はありません. make[1]: ディレクトリ '/usr/local/src/resin/resin-4.0.67' から出ます Installing Resin root /usr/local/resin. Installing Resin root subdir /usr/local/resin/project-jars. updated /usr/local/resin/project-jars Installing Resin root subdir /usr/local/resin/webapps. updated /usr/local/resin/webapps Installing Resin root subdir /usr/local/resin/webapp-jars. cp: 'webapp-jars/*' を stat できません: そのようなファイルやディレクトリはありません skipped webapp-jars Installing Resin root subdir /usr/local/resin/endorsed. updated /usr/local/resin/endorsed Installing Resin root subdir /usr/local/resin/resin-inf. cp: 'resin-inf/*' を stat できません: そのようなファイルやディレクトリはありません skipped resin-inf Installing Resin root subdir /usr/local/resin/app-inf. cp: 'app-inf/*' を stat できません: そのようなファイルやディレクトリはありません skipped app-inf Installing Resin root subdir /usr/local/resin/doc. Installing Resin home /usr/local/resin. Installing Resin home subdir /usr/local/resin/libexec64. cp: 'libexec64/*' を stat できません: そのようなファイルやディレクトリはありません skipped libexec64 Installing Resin home subdir /usr/local/resin/bin. updated /usr/local/resin/bin Installing Resin home subdir /usr/local/resin/lib. updated /usr/local/resin/lib Installing Resin log /usr/local/resin/log. Setting /usr/local/resin/bin/resinctl executable. Setting /usr/local/resin/bin/resin.sh executable. Installing Resin conf /usr/local/resin/conf. Installing Resin conf subdir /usr/local/resin/conf/keys. cp: 'keys/*' を stat できません: そのようなファイルやディレクトリはありません skipped keys Installing Resin conf subdir /usr/local/resin/conf/licenses. cp: 'licenses/*' を stat できません: そのようなファイルやディレクトリはありません skipped licenses Installing Resin conf file /usr/local/resin/conf/resin.xml. Installing Resin conf file /usr/local/resin/conf/resin.properties. Installing Resin conf file /usr/local/resin/conf/app-default.xml. Installing Resin conf file /usr/local/resin/conf/cluster-default.xml. Installing Resin conf file /usr/local/resin/conf/health.xml. Installing Resin init.d script /etc/rc.d. make[1]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src' に入ります Installing configured Resin plugins common resin_os make[2]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src/common' に入ります Installing plugin common make[2]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src/common' から出ます make[2]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src/resin_os' に入ります Installing plugin resin_os cp libresin_os.so /usr/local/resin/libexec64 make[2]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src/resin_os' から出ます make[1]: ディレクトリ '/usr/local/src/resin/resin-4.0.67/modules/c/src' から出ます # |
javaの環境変数を設定する。
JAVA_HOME変数やRESIN_HOME変数を設定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# vi /etc/profile /etc/profile_org # # vi /etc/profile # # diff /etc/profile_org /etc/profile 8a79,83 > > export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64 > export PATH=$PATH:$JAVA_HOME/bin > export CLASSPATH=.:$JAVA_HOME/lib > export RESIN_HOME=/usr/local/resin # # source /etc/profile # |
resinを起動する。
rootユーザでインストールすると、resinの起動と停止を行うシェルが以下にインストールされる。
/etc/rc.d/resin
resinを起動する。
1 2 3 4 5 6 7 8 |
# /etc/rc.d/resin start Starting resin: . # # ps -fea | grep java root 237142 1 25 21:33 pts/0 00:00:02 /usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64/bin/java -Dresin.watchdog=app-0 -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true -Djava.awt.headlesslib=true -Dresin.home=/usr/local/resin/ -Dresin.root=/usr/local/resin -Xrs -server com.caucho.boot.WatchdogManager -root-directory /usr/local/resin -conf /usr/local/resin/conf/resin.xml -log-directory /usr/local/resin/log start-all --log-directory /usr/local/resin/log root 237208 237142 69 21:33 pts/0 00:00:06 /usr/lib/jvm/java-17-openjdk-17.0.14.0.7-2.el9.x86_64/bin/java -Dresin.server=app-0 -Djava.util.logging.manager=com.caucho.log.LogManagerImpl -Djava.system.class.loader=com.caucho.loader.SystemClassLoader -Djavax.management.builder.initial=com.caucho.jmx.MBeanServerBuilderImpl -Djava.awt.headless=true -Djava.awt.headlesslib=true -Dresin.home=/usr/local/resin/ -server com.caucho.server.resin.Resin --root-directory /usr/local/resin -conf /usr/local/resin/conf/resin.xml -server app-0 -socketwait 33483 -root-directory /usr/local/resin -log-directory /usr/local/resin/log start-all --log-directory /usr/local/resin/log root 237302 222069 0 21:34 pts/0 00:00:00 grep --color=auto java # |
javaプロセスが起動されている。
resinの動作を確認する。
ポート番号8080にアクセスして、resinのデフォルト・ホーム・ページが表示される事を確認する。
http://<IPアドレス>:8080/
※ポート番号を変更する場合は、conf/resin.propertiesファイルのポート番号を変更する必要がある。
nginx経由でresinにアクセス
javaプログラムをnginx経由でresinにアクセスして実行させる。
nginxにproxyを設定する。
location ~ ^/api/.*$
・/api/にアクセスされたら、/api/を削除してresinに転送して処理させる。
location /resin-admin/
・resin summary(resin管理画面)を表示させるため、resinに転送して処理させる。
・インターネットからアクセスできるため、認証処理を定義する。
※インターネットからアクセスすると他の画面に遷移できない。proxyの設定が間違っていると思うが、インターネットからアクセスすることは無いと思われるためそのままとする。
location /resin-doc/
・resinのドキュメントを表示するため、resinに転送して処理させる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# cd /etc/nginx/default.d/ # # vi resin_proxy.conf # # cat resin_proxy.conf location ~ ^/api/.*$ { # JAVAアプリ領域 rewrite /api/(.*)$ /$1 break; proxy_pass http://127.0.0.1:8080; } location /resin-admin/ { # resin-admin proxy_pass http://127.0.0.1:8080$uri; include /etc/nginx/resin_proxy_param.conf; auth_basic "Restricted"; auth_basic_user_file /etc/nginx/.htpasswd; } location /resin-doc/ { # resin-doc proxy_pass http://127.0.0.1:8080$uri; include /etc/nginx/resin_proxy_param.conf; } # # nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful # # systemctl restart nginx # |
proxyの動作を確認する。
nginxのproxy設定によりresinにアクセスしてresin-docを表示する。
http://<nginxアクセスのIPアドレス>/resin-doc/
javaプログラムでhello world表示
javaソースファイルを記述して、「hello world!」をブラウザに表示させる。
javaプログラムを実行環境のweb.xmlファイルを作成する。
web.xmlファイルを作成する。
/helloにアクセスされたら、/test/HelloServletクラスを実行する定義を記述する。
・<servlet-class>に実行するJAVAのクラスファイルの「test.HelloServlet」を記述する。
・<url-pattern>にJAVAクラスファイルを実行するアクセス先のURLを記述する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# cd /usr/local/resin/webapps/ROOT/WEB-INF # # vi web.xml # # cat web.xml <web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http:/java.sun.com/dtd/web-app_2_3.dtd"> <servlet> <servlet-name>hello</servlet-name> <servlet-class>test.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> </web-app> # |
javaソースを作成する。
resinのドキュメントのソースファイルを記載する。
「Hello, world!」を表示するjavaプログラムソースを作成する。
package名test内にHelloServletクラスが有る記述のため以下のパスにソースファイルを作成する。
/usr/local/resin/webapps/ROOT/class/test/HelloServlet.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# cd /usr/local/resin/webapps/ROOT/class # # mkdir test # # cd test # # vi HelloServlet.java # # cat HelloServlet.java package test; import java.io.*; import javax.servlet.http.*; import javax.servlet.*; public class HelloServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); out.println("Hello, world!"); out.close(); } } # |
resinを再起動する。
ビルドされた実行ファイルを実行可能な環境に配置し、実行できるようにする(デプロイ)ためresinを再起動する。
※約2分待てば、自動的にデプロイが実行されるが、すぐに確認したいためresinを再起動してデプロイを実行させる。
1 2 3 4 5 6 |
# /etc/rc.d/resin stop Stopping resin: . # # /etc/rc.d/resin start Starting resin: . # |
javaアプリにアクセスる。
nginx経由でresinのjavaアプリにアクセスする。
http://<nginxアクセスのIPアドレス>/api/hello
MYSQLにJAVAからアクセス
javaプログラムでMYSQLデータベースにアクセスしてテーブルの内容を表示する。
データベースのデータを確認する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# mysql -u test000 -p -h localhost test Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 1996 Server version: 10.5.27-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [test]> MariaDB [test]> MariaDB [test]> select * from usertable; +--------+--------+--------+---------------+---------------+-------------+-------+-------+-------+ | number | sei | mei | phone | mailaddress | password | yobi1 | yobi2 | yobi3 | +--------+--------+--------+---------------+---------------+-------------+-------+-------+-------+ | 1 | せい | 太郎 | phone | mail1@address | mypassword | | | | +--------+--------+--------+---------------+---------------+-------------+-------+-------+-------+ | 2 | せい | 次郎 | 090-9999-9999 | mail2@address | mypassword2 | | | | +--------+--------+--------+---------------+---------------+-------------+-------+-------+-------+ 2 rows in set (0.000 sec) MariaDB [test]> exit Bye [root@lifebook ~]# |
MYSQLドライバを入手する。
以下のurlからMYSQLのドライバ(mysql-connector-j-9.2.0-1.el9.noarch.rpm)を入手する。
https://dev.mysql.com/downloads/connector/j/
MYSQLドライバをインストールする。
1 2 3 4 5 6 7 8 9 10 11 12 |
# rpm -ivh ./mysql-connector-j-9.2.0-1.el9.noarch.rpm # # rpm -ql mysql-connector-j-9.2.0-1.el9.noarch /usr/share/doc/mysql-connector-j /usr/share/doc/mysql-connector-j/CHANGES /usr/share/doc/mysql-connector-j/INFO_BIN /usr/share/doc/mysql-connector-j/INFO_SRC /usr/share/doc/mysql-connector-j/LICENSE /usr/share/doc/mysql-connector-j/README /usr/share/java/mysql-connector-j.jar /usr/share/java/mysql-connector-java.jar # |
MYSQLドライバをresinが利用できる様に設定する。
mysqlドライバがresinのlibディレクトリに無いため、認識できる様にリンクを設定する。
1 2 3 4 5 6 7 |
# cd /usr/local/resin/webapps/ROOT/WEB-INF/lib # # ln -s /usr/share/java/mysql-connector-j.jar mysql-connector-j.jar # ls -l 合計 0 lrwxrwxrwx 1 root root 37 3月 9 18:57 mysql-connector-j.jar -> /usr/share/java/mysql-connector-j.jar # |
resin-web.xmlについて
javaソースにデータベース情報を記載するためresin-xmlファイルは作成しない。
javaプログラムを実行環境のweb.xmlファイルを作成する。
/databaseselectにアクセスされたら、/DatabaseSelectクラスを実行する定義を記述する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# cp web.xml web.xml_org # # vi web.xml # # diff -c web.xml_org web.xml *** web.xml_org 2025-03-11 19:57:54.430389269 +0900 --- web.xml 2025-03-09 18:49:22.915337431 +0900 *************** *** 5,13 **** --- 5,21 ---- <servlet-name>hello</servlet-name> <servlet-class>test.HelloServlet</servlet-class> </servlet> + <servlet> + <servlet-name>databaseselect</servlet-name> + <servlet-class>DatabaseSelect</servlet-class> + </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> + <servlet-mapping> + <servlet-name>databaseselect</servlet-name> + <url-pattern>/databaseselect</url-pattern> + </servlet-mapping> </web-app> # |
MYSQLにアクセスするソースを作成する。
MYSQLデータベースにアクセスするjavaプログラムソースを作成する。
package化していないため、以下のパスにソースファイルを作成する。
/usr/local/resin/webapps/ROOT/class/DatabaseSelect.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
# cd /usr/local/resin/webapps/ROOT/WEB-INF/classes # # vi DatabaseSelect.java # # cat DatabaseSelect.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; public class DatabaseSelect extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>データベーステスト</title>"); out.println("</head>"); out.println("<body>"); Connection conn = null; String url = "jdbc:mysql://localhost:3306/test"; String user = "test000"; String password = "mypassword"; try { Class.forName("com.mysql.cj.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); String sql = "select * from usertable"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int number = rs.getInt("number"); String sei = rs.getString("sei"); String mei = rs.getString("mei"); String mailaddress = rs.getString("mailaddress"); out.println("<p>"); out.println("番号:" + number + ", 姓:" + sei + ", 名:" + mei + ", メールアドレス:" + mailaddress); out.println("</p>"); } rs.close(); stmt.close(); }catch (ClassNotFoundException e){ out.println("ClassNotFoundException:" + e.getMessage()); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); }catch (Exception e){ out.println("Exception:" + e.getMessage()); }finally{ try{ if (conn != null){ conn.close(); } }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); } } out.println("</body>"); out.println("</html>"); } } # |
resinを再起動する。
ビルドされた実行ファイルを実行可能な環境に配置し、実行できるようにする(デプロイ)ためresinを再起動する。
1 2 3 4 5 6 |
# /etc/rc.d/resin stop Stopping resin: . # # /etc/rc.d/resin start Starting resin: . # |
javaアプリにアクセスる。
nginx経由でresinのjavaアプリにアクセスする。
http://<nginxアクセスのIPアドレス>/api/databaseselect
xmlファイルを利用してMYSQLにアクセスする
resin-web.xmlファイルにデータベース情報を記述して、アクセスする。
resin-web.xmlを作成する。
resin-web.xmlに、<database>や<driver>などを定義する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# cd /usr/local/resin/webapps/ROOT/WEB-INF # # vi resin-web.xml # cat resin-web.xml <web-app xmlns="http://caucho.com/ns/resin"><br /> <database> <jndi-name>jdbc/mysql</jndi-name>] <driver> <type>com.mysql.cj.jdbc.Driver</type> <url>jdbc:mysql://localhost:3306/test</url> <user>test000</user> <password>mypassword</password> <init-param useUnicode="true"/> </driver> </database> </web-app> # |
MYSQLにアクセスするソースを作成する。
InitialContextを使用して、jdbc/mysqlというJNDI名でデータソースを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# cd /usr/local/resin/webapps/ROOT/WEB-INF/classes # # vi DatabaseSelect2.java # # cat DatabaseSelect2.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import javax.naming.Context; import javax.naming.InitialContext; public class DatabaseSelect2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>データベーステスト</title>"); out.println("</head>"); out.println("<body>"); Connection conn = null; PreparedStatement statement = null; try { // JNDIを使用してデータソースを取得 Context initContext = new InitialContext(); DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/mysql"); conn = ds.getConnection(); Statement stmt = conn.createStatement(); String sql = "select * from usertable"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int number = rs.getInt("number"); String sei = rs.getString("sei"); String mei = rs.getString("mei"); String mailaddress = rs.getString("mailaddress"); out.println("<p>"); out.println("番号:" + number + ", 姓:" + sei + ", 名:" + mei + ", メールアドレス:" + mailaddress); out.println("</p>"); } rs.close(); stmt.close(); // }catch (ClassNotFoundException e){ // out.println("ClassNotFoundException:" + e.getMessage()); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); }catch (Exception e){ out.println("Exception:" + e.getMessage()); }finally{ try{ if (conn != null){ conn.close(); } }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); } } out.println("</body>"); out.println("</html>"); } } # |
差分を比較する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
# diff -c DatabaseSelect.java DatabaseSelect2.java *** DatabaseSelect.java 2025-03-31 19:49:27.262361522 +0900 --- DatabaseSelect2.java 2025-04-01 20:20:02.624951684 +0900 *************** *** 2,9 **** import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; - public class DatabaseSelect extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ --- 2,18 ---- import javax.servlet.*; import javax.servlet.http.*; import java.sql.*; + import java.sql.Connection; + import java.sql.DriverManager; + import java.sql.PreparedStatement; + import java.sql.ResultSet; + import java.sql.SQLException; + import javax.sql.DataSource; + import javax.naming.Context; + import javax.naming.InitialContext; + + public class DatabaseSelect2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException{ *************** *** 16,29 **** out.println("</head>"); out.println("<body>"); ! Connection conn = null; ! String url = "jdbc:mysql://localhost:3306/test"; ! String user = "test"; ! String password = "ESZesz7()0"; try { ! Class.forName("com.mysql.cj.jdbc.Driver").newInstance(); ! conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); --- 25,39 ---- out.println("</head>"); out.println("<body>"); ! Connection conn = null; ! PreparedStatement statement = null; try { ! // JNDIを使用してデータソースを取得 ! Context initContext = new InitialContext(); ! DataSource ds = (DataSource) initContext.lookup("java:comp/env/jdbc/mysql"); ! ! conn = ds.getConnection(); Statement stmt = conn.createStatement(); *************** *** 42,49 **** rs.close(); stmt.close(); ! }catch (ClassNotFoundException e){ ! out.println("ClassNotFoundException:" + e.getMessage()); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); }catch (Exception e){ --- 52,59 ---- rs.close(); stmt.close(); ! // }catch (ClassNotFoundException e){ ! // out.println("ClassNotFoundException:" + e.getMessage()); }catch (SQLException e){ out.println("SQLException:" + e.getMessage()); }catch (Exception e){ # |
web.xmlファイルを修正する。
web.xmlファイルを修正して、URLとclassファイルを関連付けます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
# cd /usr/local/resin/webapps/ROOT/WEB-INF # # cp web.xml web.xml_org # # vi web.xml # # diff -c web.xml_org web.xml *** web.xml_org 2025-03-31 19:35:05.370930642 +0900 --- web.xml 2025-03-25 22:13:35.450540155 +0900 *************** *** 9,14 **** --- 9,18 ---- <servlet-name>databaseselect</servlet-name> <servlet-class>DatabaseSelect</servlet-class> </servlet> + <servlet> + <servlet-name>databaseselect2</servlet-name> + <servlet-class>DatabaseSelect2</servlet-class> + </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> *************** *** 18,21 **** --- 22,29 ---- <servlet-name>databaseselect</servlet-name> <url-pattern>/databaseselect</url-pattern> </servlet-mapping> + <servlet-mapping> + <servlet-name>databaseselect2</servlet-name> + <url-pattern>/databaseselect2</url-pattern> + </servlet-mapping> </web-app> # |
javaアプリにアクセスる。
nginx経由でresinのjavaアプリにアクセスする。
http://<nginxアクセスのIPアドレス>/api/databaseselect2
結果は、javaソースにデータベースの情報を記述した時と同様です。
データベースにアクセスするパスワードの暗号化
安全のためにパスワードを暗号化しようと思ったが、暗号化はResin Proでないとダメ見たいです。
1 2 3 4 |
# /usr/local/resin/bin/resinctl password-encrypt "mypassword" password-encrypt requires Resin Pro java.lang.ClassNotFoundException: com.caucho.admin.PasswordImpl # |
まとめ
意外と簡単にMYSQLデータベースにアクセスするjavaプログラムが作成できた。インターネットのおかげである。
再度、パソコンの内臓ディスクが壊れた場合を考えての記録ですが、皆さんの参考になれば幸いです。