アタシ ポンコツ システムエンジニア

新卒ポンコツSEの成長を描く(予定の)感動のスペクタクル超大作

MySQL JDBCではコネクションを繋いだり切ったりしてはいけない

現象

先日こんな例外に遭遇しました。

java.lang.IllegalStateException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The driver was unable to create a connection due to an inability to establish the client portion of a socket.
This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable.
For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required.
For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).

発生環境

インサートをする際にその直前と直後にコネクションの接続と切断をするような
ソースを書いていました。。

インサートは数1000件レベルで発生します。。
めちゃくちゃ重くてパソコン止まりそうになりました…

原因

これの原因についてまとめている方がいらっしゃいましたので紹介します。。

どうやら原因は切ったり繋いだりを連続させて発生させてしまったこと。

プログラムの最初と最後に一回ずつ接続・切断を行うように書き換えたところ
問題解決と同時にプログラム自体の動作も劇的に改善されました!

教訓

  • MySQL JDBCではコネクションを繋いだり切ったりしてはいけない

以上。。

pom.xmlエラー発生時の解決方法

ある日のこと、リポジトリーからwebアプリケーションをチェックアウトすると下記のようなエラーが発生しました。

Failure to transfer org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4 from http://repo.maven.apache.org/maven2 was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or updates are forced. Original error: Could not transfer artifact org.apache.maven.plugins:maven-surefire-plugin:pom:2.12.4 from/to central (http://repo.maven.apache.org/maven2): repo.maven.apache.org

とりあえず、エイヤとこのままグーグル先生に投げてみると英語のサイトしか出てこなかったのでここに解決方法を日本語で書きとどめておきます。

解決方法

  1. eclipseをいったん落とす
  2. {ユーザ名}/.m2/repository/org/apache フォルダーをエクスプローラで開く
  3. maven フォルダーを削除する(一応バックアップ等とっておいた方が無難かと)
  4. eclipseを再起動する
  5. エラーを吐いていたxmlを持つプロジェクトを選択して右クリック
  6. Maven>プロジェクトの更新 をクリック

以上でエラーが消えました!

追記(2016/04/11)

会社からEclipseを利用して開発を行っている場合プロキシサーバのパスワード更新等の理由で上記エラーが出ることもあるみたいです。
上の解決方法でダメな場合はEclipseのプロキシ設定,mavenのsettings.xml({ユーザ名}/.m2/repositoryにあるはず)の見直しも行ってみるといいかも。。。

spring3 でjsonをPOSTで受け取る

学生時代はフレームワークなんて使ったこと無かったんで初めてフレームワークを利用しててんてこマイ舞いドリームなんですよ、ホント。。。
ちゅーこって、、spring3でこの前引っかかったのでメモ

やりたいこととしては

  1. クライアント側からPOSTでajax通信する
  2. JSONでHTMLのformタグのデータをサーバに投げる
  3. そいつをサーバ側で受け取ってあれこれ処理

実行環境

クライアント側

  <form id = "searchform" action = "search" method = "POST">
    <!--テキストボックスとかチェックボタンとか-->
    <button id = "searchbtn" type="submit" name = "searchbtn" onclick = "return check()">投げる</button>
  </form>
function check(){

  //テキストボックスの入力チェックとか
  var jsonString = $('form').serializeArray();
  var formData = JSON.stringify(jsonString);
	$.ajax({
		type: 'POST',
		url: '/prototype/searchUser',
		data: JSON.stringify(jsonString),
		contentType: 'application/json',
		datatype: 'json',
		scriptCharset: 'utf-8'
	}).done(function(data){
                //返ってきたときの処理
	}).fail(function(data){
		//返らなかったときの処理
	});
}

  return false;


サーバ側

        @ResponseBody
	@RequestMapping(value = "/search", method = RequestMethod.POST, produces="application/json; charset=UTF-8")
	public void searchFileInfoJson(@RequestBody String json) throws IOException, ServletException {
          //処理をあれこれ
        }

ポイント

  • サーバ側 jsonでの受け取りは@RequestBody Stringで!

 →自作のクラスを指定してそのパラメータに自動で受け取る方法もあるらしいけどうまくいかなかった
 →まぁStringで飛んでくるからこれなら間違いなく受け取ることはできる。。

これが今の僕にできる精一杯でした。
ご査収ください。

ブログはじめました。。

はじめまして、、新人ポンコツSEの獣蔵です。
本ブログは下記の目的で開設致しました。

  1. 仕事や趣味でのプログラミングで詰まった所のメモ
  2. その他、気になった話題のメモ

本ブログに記載される技術的な文章はあくまで個人の備忘録レベルのものなので責任はとれません。
ご参考までにお願いします。

twitterやってます。↓
@kemonogura