質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

Q&A

解決済

2回答

1904閲覧

JavaでMySQLに接続した際に出るPacket for query is too largeエラーについて

asaikaeru

総合スコア13

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

0グッド

0クリップ

投稿2018/11/04 10:12

編集2018/11/04 13:11

win10環境で、vitualboxに作ったCent7OS内のMySQLに接続しようとしたところ、エラーが発生しました。

javaのコードは以下になります

java

1 public String[] setLogin() throws IOException, SAXException, ParserConfigurationException{ 2 String[] address ={"logindb","loginaddress"}; 3 String[] id = {"logindb","root"}; 4 String[] password = {"logindb","password"}; 5 String[] returns = new String[3]; 6 7 try { 8 //プロパティファイルからDB1の接続情報を入手 9 String loginaddress = "jdbc:mysql:" + propertyFileReader(address); 10 String loginid = propertyFileReader(id); 11 String loginpassword = propertyFileReader(password); 12 13 logger.info("接続情報の読み込みが完了しました"); 14 logger.info("接続用のURI:" + loginaddress); 15 logger.info("ログインID:" + loginid); 16 logger.info("ログインアドレス:" + loginpassword); 17 18 19 // MySQLのドライバを指定 20 Class.forName("com.mysql.jdbc.Driver"); 21 22 // DriverManagerクラスのメソッドで接続する 23 Connection conn = DriverManager.getConnection(loginaddress,loginid,loginpassword); 24 25 // SQL送信用インスタンスの作成 26 Statement st = conn.createStatement(); 27 28 //パスワード作成(ランダム8文字) 29 StringBuffer newpassword = new StringBuffer(); 30 //[0-9,A-z]の文字列の配列(ランダム文字作成用) 31 String[] randam = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","U","V","W","X","F","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","u","v","w","x","f","z"}; 32 for(int i = 0 ; i <= 8 ; i++) { 33 int r = new java.util.Random().nextInt(randam.length); 34 newpassword.append(randam[r]); 35 } 36 logger.info(newpassword.toString());//作成したパスワード 37 38 //現在日時の取得 39 LocalDateTime d = LocalDateTime.now(); 40 41 // SQLによってデータを入れる 42 st.executeUpdate("INSERT INTO LOGIN (PASWEORD,INSERTTIME) VALUES( " + newpassword.toString() + ","+ d + ")"); 43 44 // 後始末(インスタンスの正常クローズ) 45 st.close(); 46 conn.close(); 47 48 }catch (Exception e) { 49 e.printStackTrace(); 50 } 51 52 return returns; 53 54 }

エラーが発生しているのはDB接続時の『Connection conn = DriverManager.getConnection(loginaddress,loginid,loginpassword);』の部分です。
エラー内容は以下の通りです

情報: 接続情報の読み込みが完了しました [日 11 04 18:56:11 GMT+09:00 2018] 情報: 接続用のURI:jdbc:mysql://localhost:2222/db1 [日 11 04 18:56:11 GMT+09:00 2018] 情報: ログインID:root [日 11 04 18:56:11 GMT+09:00 2018] 情報: ログインアドレス:Root01; [日 11 04 18:56:11 GMT+09:00 2018] Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary. com.mysql.cj.jdbc.exceptions.PacketTooBigException: Packet for query is too large (4,739,923 > 65,535). You can change this value on the server by setting the 'max_allowed_packet' variable. at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:107) at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:835) at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455) at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240) at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207) at java.sql.DriverManager.getConnection(DriverManager.java:664) at java.sql.DriverManager.getConnection(DriverManager.java:247) at jp.angelargyle.framework.MainFrameWork.setLogin(MainFrameWork.java:373) at jp.angelargyle.testclass.testclass.main(testclass.java:29)

max_allowed_packetが足りないとのことなのでMYSQL側の設定を変更して変更されていることを確認できています。

teraterm

1mysql> show variables like 'max_allowed_packet'; 2+--------------------+-----------+ 3| Variable_name | Value | 4+--------------------+-----------+ 5| max_allowed_packet | 268435456 | 6+--------------------+-----------+ 71 row in set (0.04 sec)

しかし、上のエラーは変わらずどこの設定を変えればいいのかわかりません。
エラーが発生しているのはDB接続時であり、クエリの部分まで到達はしていません。
もし分かれば教えていただけないでしょうか。

追伸
ログインIDをわざと相違(roo)にして送りましたが、同じエラーが出ました。
どうやら、MYSQLまではたどり着いていないようです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A-pZ

2018/11/04 11:55

接続文字列などの接続情報を取得していると思われる propertyFileReader メソッドの中身に問題はないでしょうか。
asaikaeru

2018/11/04 13:10

接続情報がおかしい場合(例:ポートを3333に変更)『Communications link failure』のエラーが出るため、接続先は問題ないと思われます。ただ、ログインIDをわざと間違えて送っても同じエラーが返ってきたため、どうやらMYSQLまでたどり着いていないようです。
A-pZ

2018/11/04 14:46

なので、propertyFileReader メソッドの実装に問題はないでしょうか。例えば過剰にループしてデータを返してしまい、接続文字列が想定外の長さになってしまっていませんでしょうか。
asaikaeru

2018/11/04 14:55

エラーの情報でメソッドの結果が出力されていますが、接続用のURI、ログインID、ログインアドレスは正常に返ってきています。
guest

回答2

0

一応、SQLまで通ることが確認できたため、文を記載。

java

1 public void selectLogin() throws IOException, SAXException, ParserConfigurationException{ 2 3 Session session; 4 ChannelExec channel; 5 6 try { 7 //プロパティファイルからDB1の接続情報を入手 8 String loginaddress = "jdbc:mysql:" + propertyFileReader(address); 9 String loginid = propertyFileReader(id); 10 String loginpassword = propertyFileReader(password); 11 12 logger.info("接続情報の読み込みが完了しました"); 13 logger.info("接続用のURI:" + loginaddress); 14 logger.info("ログインID:" + loginid); 15 logger.info("ログインアドレス:" + loginpassword); 16 17 Properties config = new Properties(); 18 config.put("StrictHostKeyChecking", "no"); 19 20 JSch jsch = new JSch(); 21 22 // Linuxのユーザー、サーバー名、ポート、パスワードを指定 23 session = jsch.getSession("testuser" , "127.0.0.1" , 2222); 24 session.setPassword("Root01"); 25 session.setConfig(config); 26 session.connect(); 27 28//ポートの変換(今回は変更なし) 29 session.setPortForwardingL(3306, "127.0.0.1", 3306); 30 31 32 // MySQLのドライバを指定 33 Class.forName("com.mysql.jdbc.Driver").newInstance(); 34 35 // DriverManagerクラスのメソッドで接続する 36 Connection conn = DriverManager.getConnection(loginaddress,loginid,loginpassword); 37 38 // SQL送信用インスタンスの作成 39 Statement st = conn.createStatement(); 40 41 String sql = "SELECT * FROM db1"; 42 logger.info(sql); 43 44 // SQLによってデータを入れる 45 st.executeQuery(sql); 46 47 48 // 後始末(インスタンスの正常クローズ) 49 st.close(); 50 conn.close(); 51 52 53 }catch (Exception e) { 54 e.printStackTrace(); 55 } 56 57 return returns; 58 59 }

投稿2018/11/05 13:35

asaikaeru

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

結論として、Linux(Cent7OS)のMySQLまでsshで接続していたため、Linuxに入る際にログインIDを請求されてはじかれてしまったようです。
sshでの接続の場合は、jschを使ってLinuxにログインしたうえでSQLを動かさないといけないようです。
まだ、jschでの接続にはうまくいっていませんが、原因が判明したため、一度この問いは閉じたいと思います。

A-pZ様の助言によってそこまでたどり着きました。本当にありがとうございました。

投稿2018/11/04 15:01

asaikaeru

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問