@が多くなりカテゴリが多くなり、状況が限定化されてきてしまった。
実際にやってみるとフレームワークとかにどっぷりで他の状況だとあまり使えない感じになってしまったかもしれません。
前提条件
Virtualbox上のCentOS7にMySQLを導入して、ホストマシンから接続できることは確認できましたので、今後は開発プロジェクトから接続できるようにします。
MySQL、Linuxサーバ側の環境構築
www.wantanblog.com
開発プロジェクト側の設定、環境構築など
www.wantanblog.com
MySQL側の準備
テーブル作成
Eclipseのアプリケーション側から参照するテーブルを作成する。
作成済みの場合は飛ばしてもOKだし、内容は自身のアプリに即したものに変えなけらばならない。
私の場合は以下の通りとした。
create table todoMyBatis( todoMyBatis_id varchar(36) primary key, todoMyBatis_title varchar(30), finished boolean, created_at timestamp);
MySQLにログインして実行してもいいが、私は前回の記事でせっかく使用できるようにしたのでA5SQLを使用して実行した。
まぁ使用ツールはなんでもいいですね。
Eclipse側の設定
まずはDBの接続先を設定する以下のファイルを次のように修正した。
todoMyBatis-infra.properties
database=mysql # DEの向き先を設定 database.url=jdbc:mysql://localhost:53306 database.username=wantanhost database.password=[パスワード] database.driverClassName=com.mysql.cj.jdbc.Driver
まずはそのまま実行してみる
ただの確認。何をすればいいか探るためにやっているので飛ばしてもOK。
そうするともちろんエラーが発生する。ここからが勝負。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSourceInitializer#0': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.UncategorizedScriptException: Failed to execute database script; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Cannot load JDBC driver class 'com.mysql.cj.jdbc.Driver'
今回の場合重要なのはここの部分か。
Cannot load JDBC driver class 'com.mysql.cj.jdbc.Driver'
ドライバーが読み込めないと言われている。
MySQLドライバーを追加する@Mavenプロジェクト
ここではMavenプロジェクトで作成している場合独自の方法となります。
JDBCドライバーなどを追加する場合、Mavenプロジェクトは「pom.xml」を修正するようです。
MySQLのコネクターは以下から探しました。MySQLではない場合でも同様に探せるはずです。
Maven Repository: mysql » mysql-connector-java
私の場合は5.1.48なので以下をコピー。
mysql
mysql-connector-java
5.1.48
プロジェクト直下に存在するpom.xmlのdependenciesタグの中に追加しました。
保存するとなんとMaven依存関係のところに今追加したjarファイルが追加されるんですね~
これがMavenプロジェクトの威力なのか(Maven素人
ここで一応Mavenプロジェクトの更新を行っておきました。
ドライバーが追加できたのでサーバ実行!!
次なるエラーが発生しました。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.jdbc.datasource.init.DataSourceInitializer#0': Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.CannotReadScriptException: Cannot read SQL script from class path resource [database/mysql-schema.sql]; nested exception is java.io.FileNotFoundException: class path resource [database/mysql-schema.sql] cannot be opened because it does not exist
うん、これが素人の環境構築ですよね。
前向きにエラーを解消していきましょう。
MyBatisでのスキーマ指定
上記のエラーは原因は明らか
「 [database/mysql-schema.sql] cannot be opened because it does not exist」
「mysql-schema.sql」が存在しないことでしょう。
状況を整理しながら対処法を探ります。
・propertyファイル
/todoMyBatis/src/main/resources/META-INF/spring/todoMyBatis-infra.properties
接続先のDBやユーザを指定します。
スキーマもここで指定できたりしないのでしょうか?いまいちわかりませんでした。
・env.xml
/todoMyBatis/src/main/resources/META-INF/spring/todoMyBatis-env.xml
propertyファイルを呼び出して実際にDB接続を行うのはここか。
「mysql-schema.sql」の呼び出しもここで行っている。
<jdbc:script location="classpath:/database/${database}-schema.sql" encoding="UTF-8" /> <jdbc:script location="classpath:/database/${database}-dataload.sql" encoding="UTF-8" />
上記2行で指定してるsqlファイルを作成すればうまくいくか??
・起動時のsqlファイル
以下を新規作成した。
mysql-dataload.sql
mysql-schema.sql
記述内容はそれぞれ以下の通り。
▼mysql-schema.sql
USE文で実際に使用したいスキーマを指定する。
/* define the schemas. */ USE APP_DB;
▼mysql-dataload.sql
とりあえず元々のファイル(H2-dataload.sql)内容に合わせた。
/* load the records. */ commit;
もう一度接続確認
当該プロジェクトでサーバ実行してみると、サーバの実行ではエラーが表示されなくなりました!
デフォルトの画面が表示できるようになり、サンプルアプリの画面を表示できるようになりました。
データベースにアクセスする処理を実行すると
エラーは解消されましたが、うーんまた別のエラー。。
これはどっちかというとアプリ側のエラー?
java.sql.SQLException: Incorrect string value: '\xE3\x83\x86\xE3\x82\xB9...' for column 'todoMyBatis_title' at row 1
テーブルの文字コード設定
エラー内容から検索をかけてもいいですが、とりあえず接続できることが確証されているA5SQLからアプリで発行されたSQLを実行してみます。
同じエラーが発生しました。
INSERT INTO todoMyBatis ( todoMyBatis_id, todoMyBatis_title, finished, created_at ) VALUES ( '944b56fd-08a8-42f5-a32d-1a1440a4ba78', 'テスト', 0, '09/13/2019 22:13:49.797' )
原因はなんてことなく、挿入データに日本語は含まれていることによるDBテーブルの文字コードの問題っぽい。
テーブル作成時の考慮不足ですね。
今回やりたいことの本質からずれるので日本語は入力できない仕様としてもいいけど、さらっと以下のSQLをA5から実行した。
alter table todoMyBatis DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
ここまでやったらサーバを再起動して、画面を表示させ直すと
データベースからリストを取得でき。
登録もできました。
これでサーバのDBを使用したアプリ開発ができるようになりました!!!
warファイルを作成してTomcatにデプロイ
過去にも同様のことをやりましたが、今回はDB接続が伴う版です。
操作説明を省いているところは以下の記事と同様の操作となります。
DB接続先の再設定
接続情報を設定するプロパティファイルを次のように設定した。
まぁバージョン管理かなにかした方がいいでしょうね。
・todoMyBatis-infra.properties
database=mysql # DEの向き先を設定 #開発環境用 #database.url=jdbc:mysql://localhost:53306 #database.username=wantanhost #database.password=[パスワード] #デプロイ用設定 database.url=jdbc:mysql://localhost:3306 database.username=wantan database.password=[パスワード] database.driverClassName=com.mysql.jdbc.Driver
Eclipseからの接続は外部からの接続設定でしたが、これをLinuxサーバ上に配置して起動するので、localhostから接続するように設定をおこなっています。
warファイルの生成
操作は過去記事の通り。
無事成功しました。
Tomcatにデプロイ
操作は過去記事の通り。
無事成功しました。
動作確認
Tomcat再起動後、以下のURLへアクセス。エラーですね。。
http://localhost:50001/todoMyBatis/todoMyBatis/list
Tomcatのログを見ると以下のような記述が。。
### Error querying database. Cause: java.sql.SQLException: No database selected
### The error may exist in com/example/todoMyBatis/domain/repository/todoMyBatis/TodoMyBatisRepository.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
この辺が原因か?先に設定した「USE文」がうまくきいてない??
No database selected
MYSQLのログ見た方がよかったのかな?
いろいろ検索してみた結果対応は以下の通りとなりました。
LinuxサーバでmysqlにログインしUSE文を実行
Eclipseから接続する際には外部接続用のユーザ(wantanhost)を使用していましたが、Linuxサーバ上にソースを配置して実行していますので、今回の場合はlocalhost接続用のユーザ(wantan)に使用ユーザを変更しています。
そしてwantanユーザでは以下が実行できませんでした。
USE APP_DB;
localhost接続用のユーザでデータベースを表示する
当該ユーザでアクセスできるデータベースを表示します。
show databases;
「information_schema」しか表示されてない。ここで原因が見えてきます。
localhost接続用のユーザに全DBのアクセス権限を付与する
全DBのアクセス権限を付与するために以下を実行します。
GRANT ALL ON *.* TO wantan@'%' IDENTIFIED BY [パスワード]; FLUSH PRIVILEGES;
mysqlの再起動 一応
systemctl restart mysql
tomcatの再起動 一応
systemctl restart tomcat9
再度接続確認
やったー!
元々の原因は環境構築時の権限設定ミスですかね。
これでローカルで開発、仮想サーバにデプロイまでできるようになりました。
やっといろいろ試せます。