準備
javaからMySQLに接続するためにまずはJDBCを入手します。
JDBCはJava DataBase Connectivityの略でデータベース操作専用のAPIです。
下記からダウンロードしてきます。 http://dev.mysql.com/downloads/connector/j/
「mysql-connector-java-5.1.38.tar.gz」というファイルがダウンロードされました。さっそく解凍します。
するとフォルダの中に「mysql-connector-java-5.1.38-bin.jar」というjarファイルがあるので、適当なフォルダに配置します。
プログラム
さっそくMySQLに接続するプログラムを用意します。
下記のような形にしました。
import java.sql.*; public class Main { public static void main(String[] args) { Connection con = null; try { // JDBCドライバのロード Class.forName("com.mysql.jdbc.Driver").newInstance(); // MySQLに接続 con = DriverManager.getConnection("jdbc:mysql://localhost/DBNAME","USER_ID","PASSWORD"); System.out.println("接続成功"); } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { System.out.println("JDBCドライバのロードに失敗"); } catch (SQLException e) { System.out.println("接続失敗"); e.printStackTrace(); } finally { if (con != null) { try { con.close(); } catch (SQLException e) { System.out.println("切断失敗"); } } } } }
コンパイルして実行してみましょう。
#コンパイル javac -cp ./mysql-connector-java-5.1.38-bin.jar: Main.java #実行 java -cp ./mysql-connector-java-5.1.38-bin.jar: Main
「接続成功」と出力されれば、MySQLサーバーに接続できています。
接続できない場合
「接続失敗」と出力された場合は、なぜ接続できなかったのかエラーの詳細を調べてみましょう。
SQLExceptionの詳細を知りたいのでprintStackTraceでエラー内容を表示させます。
具体的には下記のようにプログラムに追記します。
try { con.close(); } catch (SQLException e) { System.out.println("切断失敗"); #ここに追記 e.printStackTrace(); }
すると下記のようなメッセージが出力されました。
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
サーバーに接続できていないようですね。
my.cnfのbind-address設定を確認してみる
これからはMySQLサーバーがCentOS6にインストールされていることを前提に解説してみます。
my.cnfの設定を確認してみましょう。
デフォルトでは外部からの接続ができないようになっていると思いますので
下記の記述をmy.cnfに追記します。
bind-address = (接続したいマシンのIPアドレス)
ファイアーウォール設定を確認
次にファイアーウォールの設定を確認してみましょう。 MySQLサーバーに外部から接続するには3306ポートを開いておく必要があります。
まずiptablesを開きます。
#iptables vi /etc/sysconfig/iptables
たとえば、下記のような設定を追加します。
-A INPUT -p tcp -m tcp --dport 3306 -j ACCEPT
再起動させます。
service iptables restart
mysqldのuserテーブルの設定
次にmysqlのuserテーブルの設定を確認してみます。
select user, host from mysql.user; => +-------+-----------------+ | user | host | +-------+-----------------+ | root | 127.0.0.1 | | root | localhost | +-------+-----------------+
これだとローカルからしかMySQLに接続できません。
外部から接続できるようにユーザーを作成してみましょう。
#ユーザーを作成 create user ‘USERNAME’@'HOSTNAME' identified by ‘PASSWORD'; #作成したユーザーに権限を設定 grant all privileges on DATABASENAME.* to 'USERNAME'@'%'identified by 'PASSWORD' with grant option; #権限を再ロードします flush privileges; #権限が追加されたか確認してみましょう。 select user, host from mysql.user; => +----------+-----------------+ | user | host | +----------+-----------------+ | root | 127.0.0.1 | | root | localhost | | sample | localhost | | user1 | % | +----------+-----------------+
なお、ホスト名の確認するには下記のコマンドを使います。
show variables like 'hostname';
接続できるか確認します。
Mysqlに接続できるか確かめてみましょう。
>mysql -h 接続先ホスト名 -u sample -p