前提・実現したいこと
前提:すみません、新米SEです。javaにてHPを作っており、AWSを使って公開しようとしています。稚拙な質問かもしれませんがどうかお願いいたします。
結論:AWSのEC2上にインストールしたDB(mysql)のJDBC URLの記述方法や、EC2サーバー上でjavaからmysqlを扱う際に必要な設定・作業が知りたい。
詳細
:①アプリケーションサーバー ⇨ AWS EC2にtomcatをインストール、ローカルのeclipseで作成したWARファイルを搭載。
:②データベース ⇨ ①と同じEC2上にmysqlをインストール。DBの作成まで完了。
①にて作成したjavaのアプリは動作するが、DBアクセスの部分ができていない。
ローカルで開発していた際は接続できており、jdbc周りが原因ではないかと考えています。
他におすすめの方法がありましたら別の方法でも大丈夫です。
※この方法に拘っていません。
以下のソースコードは、上がローカルで動作していた時のもの。
下は、EC2に移行させた後自分で考えていくつか書き換えています。
書き換えた箇所
・jdbcUrlの文字列。
localhostから、DNS名:ポート/DB名に変更。
localhostから、IPアドレス:ポート/DB名に変更。
・com.mysql.cj.jdbc.Driverをcom.mysql.jdbc.Driverへ。
発生している問題・エラーメッセージ
・EC2上でWEBアプリを動作させると、DBアクセスの部分が機能しなくなる。 ・DBから情報を引っ張ってこれない。 (ログイン機能を実装しており、正しいパラメータを渡してもログインできない。)
該当のソースコード
java
1/**----------------------------------------------------------------------* 2 *■■■TJMEMDaoクラス■■■ 3 *概要:DAO(「MEMBERS」テーブル) 4 *----------------------------------------------------------------------**/ 5public class TJDao { 6 7 //------------------------------------------- 8 //データベースへの接続情報 9 //------------------------------------------- 10 //いずれはここを、AWSのDBにしたい。 11 String jdbcUrl = "jdbc:mysql://localhost/takejam2020"; 12 String userId = "chikashi"; 13 String password = "takejam"; 14 15 //---------------------------------------------------------------- 16 //メソッド 17 //---------------------------------------------------------------- 18 /**----------------------------------------------------------------------* 19 *■doSelectメソッド 20 *概要 :引数のユーザー情報に紐づくユーザーデータを「MEMBERS」テーブルから抽出する 21 *引数①:ユーザーID(ユーザー入力) 22 *引数②:パスワード(ユーザー入力) 23 *戻り値:「MEMBERS」テーブルから抽出したユーザーデータ(UTJMEMDto型) 24 *----------------------------------------------------------------------**/ 25 26 public TJDto doSelect(String inputUserName, String inputPassWord) { 27 28 //------------------------------------------- 29 //JDBCドライバのロード(不要) 30 //------------------------------------------- 31 try { 32 Class.forName("com.mysql.cj.jdbc.Driver"); 33 }catch(ClassNotFoundException e) { 34 e.printStackTrace(); 35 } 36 37 //------------------------------------------- 38 //SQL発行 39 //------------------------------------------- 40 Connection con = null; 41 //prepared statementの準備 importが必要 42 PreparedStatement ps = null; 43 //result setの準備 importが必要 44 ResultSet rs = null; 45 //DTOの準備 46 //TJMEMDto dto = null; 47 TJDto dto = new TJDto(); 48 49 //------------------------------------------- 50 //takejam2020 DBへ接続 51 //------------------------------------------- 52 try {//try with resource文 53 54 55 //------------------------------------------- 56 //接続の確立(Connectionオブジェクトの取得) 57 //------------------------------------------- 58 con = DriverManager.getConnection(jdbcUrl, userId, password); 59 60 61
java
1/**----------------------------------------------------------------------* 2 *■■■TJMEMDaoクラス■■■ 3 *概要:DAO(「MEMBERS」テーブル) 4 *----------------------------------------------------------------------**/ 5public class TJDao { 6 7 //------------------------------------------- 8 //データベースへの接続情報 9 //------------------------------------------- 10 String jdbcUrl = "jdbc:mysql://ec2-35-72-4-42.ap-northeast-1.compute.amazonaws.com:3306/takejam2020"; 11 String userId = "chikashi"; 12 String password = "takejam"; 13 14 //---------------------------------------------------------------- 15 //メソッド 16 //---------------------------------------------------------------- 17 /**----------------------------------------------------------------------* 18 *■doSelectメソッド 19 *概要 :引数のユーザー情報に紐づくユーザーデータを「MEMBERS」テーブルから抽出する 20 *引数①:ユーザーID(ユーザー入力) 21 *引数②:パスワード(ユーザー入力) 22 *戻り値:「MEMBERS」テーブルから抽出したユーザーデータ(UTJMEMDto型) 23 *----------------------------------------------------------------------**/ 24 25 public TJDto doSelect(String inputUserName, String inputPassWord) { 26 27 //------------------------------------------- 28 //JDBCドライバのロード 29 //------------------------------------------- 30 try { 31 Class.forName("com.mysql.cj.jdbc.Driver"); 32 }catch(ClassNotFoundException e) { 33 e.printStackTrace(); 34 } 35 36 //------------------------------------------- 37 //SQL発行 38 //------------------------------------------- 39 Connection con = null; 40 //prepared statementの準備 importが必要 41 PreparedStatement ps = null; 42 //result setの準備 importが必要 43 ResultSet rs = null; 44 //DTOの準備 45 //TJMEMDto dto = null; 46 TJDto dto = new TJDto(); 47 48 //------------------------------------------- 49 //takejam2020 DBへ接続 50 //------------------------------------------- 51 try {//try with resource文 52 53 54 //------------------------------------------- 55 //接続の確立(Connectionオブジェクトの取得) 56 //------------------------------------------- 57 con = DriverManager.getConnection(jdbcUrl, userId, password); 58 59 60
試したこと
上のソースコードは、上がローカルで動作していた時のものになります。
下は、EC2に移行させた後自分で考え、いくつか書き換えています。
●書き換えた箇所
・jdbcUrlの文字列。
localhostから、DNS名:ポート/DB名に変更。
localhostから、IPアドレス:ポート/DB名に変更。
・com.mysql.cj.jdbc.Driverをcom.mysql.jdbc.Driverへ。
●その他試したこと。
- 以下を参考に、EC2のポート3306を開放。
https://medium.com/modernnerd-code/connecting-to-mysql-db-on-aws-ec2-with-jdbc-for-java-91dba3003abb
2. サーバーの再起動。(WARを修正するたび再起動しています。)
素人考えで大変恐縮ですが、DBアクセスする部分のjavaまでは問題なく動作していますのでDAOが原因と思い、ソースを載せさせていただきました。
また、プログラミングの質問をさせていただくのは人生初でして、何かこの情報も載せて欲しいというものがあれば仰っていただきたいです。
みなさま、レベルの低い質問で大変恐縮ですが、重ねてどうかよろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
各種バージョン
・mysql Ver 8.0.21 for Linux on x86_64 (MySQL Community Server - GPL)
・Apache Tomcat/7.0.76
・openjdk version "1.8.0_252"
・OpenJDK Runtime Environment (build 1.8.0_252-b09)
・OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)
・開放ポート:80,443,22, 8080(tomcat用), 3306(mysql用)
回答3件
あなたの回答
tips
プレビュー