赤塚不二夫 : 話

頭のいいヤツは、
わかりやすく話す。

頭の悪いヤツほど、
難しく話すんだよ。

赤塚不二夫 : 馬鹿

バカっていうのは
自分がハダカになることなんだよ。

世の中のいろんな常識を無視して、
純粋な自分だけのものの見方や
生き方を押し通すことなんだよ。

だから、バカだからこそ
語れる真実っていっぱいあるんだ。

Linux コマンド x日以上前 最後に修正されたファイルの削除

よく忘れるので備忘録しておきます。
溜まった過去ログの古く不要なのを削除するのに使ってます。

[ コマンド例 ]

180日以上前のファイルを削除

 

find /parentdirectoryname/directoryname -mtime +180 -exec rm -f {} \;

詳しくはここに書いてくださってます : https://qiita.com/narumi_/items/9ea27362a1eb502e2dbc

Linux Shell ディレクトリサイズスクリプト (du find)

Windows でディレクトリのサイズ合計を見せてくれるアプリがありますが、Linuxで同様のことがわかるシェルスクリプトを作ってます。
容量的に厳しくなってきたサーバーのファイル整理、無駄に溜まってる過去のログのチェックなどに使えると思います。

調べたいディレクトリをカレントにして、コマンドを実行。
shファイルのフルパスを指定する必要あるので、alias で設定しておけば便利と思います。

[ スクリプト ]

#!/bin/sh

#
# target directory file size summary list
#

tgt=`pwd`

echo ${tgt}
dirs=${tgt}/*

# loop current directory #
for filepath in ${dirs}; do
  # if filename belongs directory #
  if [ -d ${filepath} ]; then 
     
     # if excluded dir, do nothing. 
    if [ $# -eq 2 ] && [ $1 = "E" ] && [ $2 = ${filepath} ] ; then
      echo ${filepath}" ignored"
    else 
	  du -sh ${filepath}
    fi
    
    # if param count equals 1 and "C" #
    # print a file count # 
    if [ $# -eq 1 ]; then
      if [ $1 = "C" ]; then
        find ${filepath} | wc -l 
        echo "---------------------------------"
      fi
    fi
  fi 
done

[ 利用例 ]

引数なし

[root@???? opt]# /scriptdir/scriptname.sh
/opt
30M	/opt/firebird
190M	/opt/google
382M	/opt/openoffice4
700M	/opt/saw17
392M	/opt/sqlanywhere16

$1 : C
ファイル数も出力

[root@???? opt]# scriptdir/scriptname.sh C
/opt
30M	/opt/firebird
256
---------------------------------
190M	/opt/google
101
---------------------------------
382M	/opt/openoffice4
4275
---------------------------------
700M	/opt/saw17
1913
---------------------------------
392M	/opt/sqlanywhere16
2810
---------------------------------

$1 : E
$2 : 対象からはずすディレクトリ

[root@???? opt]# /scriptdir/scriptname.sh E /opt/google
/opt
30M	/opt/firebird
/opt/google ignored
382M	/opt/openoffice4
700M	/opt/saw17
392M	/opt/sqlanywhere16

MySQL データベースサイズストアド

mysql のコマンドで、テーブルの定義や細かいステータスは見れますが、ふと収容先の全データベースのサイズを見る必要があったので、自作してます。
名前は、コマンド用なので短くして、引数なしにしてます。

[ DDL ]


CREATE DEFINER=`root`@`localhost` PROCEDURE `dbsize`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '簡単データベースサイズ'
BEGIN

SELECT 
    table_schema,
    sum(data_length) /1024/1024 + sum(index_length) /1024/1024 AS total_mb,
    sum(data_length) /1024/1024 AS data_mb,
    sum(index_length) /1024/1024 AS index_mb
FROM 
    information_schema.tables  
GROUP BY 
    table_schema 
ORDER BY       
    sum(data_length + index_length) DESC;

END

[ 利用例 ]

mysql> call dbsize;
+--------------------+---------------+---------------+---------------+
| table_schema       | total_mb      | data_mb       | index_mb      |
+--------------------+---------------+---------------+---------------+
| ??????????         | 4028.40940857 | 2589.96604919 | 1438.44335938 |
| ??????????         | 3389.75976753 | 2149.07226753 | 1240.68750000 |
| ??????????         | 1720.67187500 |  812.59375000 |  908.07812500 |
| mysql              |   11.26994324 |   10.99552917 |    0.27441406 |
| ??????             |    3.45312500 |    2.07812500 |    1.37500000 |
| information_schema |    0.15625000 |    0.15625000 |    0.00000000 |
| sys                |    0.01562500 |    0.01562500 |    0.00000000 |
| performance_schema |    0.00000000 |    0.00000000 |    0.00000000 |
+--------------------+---------------+---------------+---------------+
19 rows in set (0.27 sec)

Query OK, 0 rows affected (0.27 sec)

Java Servlet ファイルアップロードの基本

管理人のわかりにくいコードよりも、以下に説明されているのが、一番シンプルでわかりやすいかと思い、リンクを貼っておきます。

Qiitaのリンク : https://qiita.com/ohke/items/bec00a69d3f538aab06b

[ 説明・感想 ]

  1. アノテーションを使っているので、web.xmlの記述がなくすっきりしている (最近はこれが普通か)
  2. 送信用ページでのクライアントのファイル名が使われ、サーバー内の隠蔽されたパスに保存されてるが、実際は違う名前で、別に設定されたパスに保存されることが多いと思います。
  3. サーバー内である場合、再配備の時に消えてしまうので、永続的利用を前提とした場合、上 2) が現実的
  4. あくまで、説明用としてご紹介して下さってるサンプルに、けちつけるのは控えます。
  5. JSP側で、ファイルサイズの制限をJavascriptで設定するのが、大容量アップロードを未然回避する為、重要と思いますが、servlet3の maxFileSize で制御出来るので、二重防御、将来的Javascript仕様変更の影響を受けず無難。
  6. マルチファイルの場合は、request.getParts()で配列でとれるので、ループして保存出来ます。

MyBatis MySQL 開発環境でのプーリング接続で、Too many connections の解消

本番環境では普通に JNDI のプーリングが効いて、接続数過多のエラーはまずは発生しないですが、NetBeansの開発環境で JNDI が使えないので (管理人が知らないだけなのかも)、MyBatis の設定は、MyBatis のPOOL を使ってます。


    <environment id="?????">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${msdriver}"/>
        <property name="url" value="${msurl}"/>
        <property name="username" value="${msusername}"/>
        <property name="password" value="${mspassword}"/>
        
        <!-- maybe not affect --> 
        <property name="poolMaximumActiveConnections" value="1000" /> 
        <property name="poolMaximumIdleConnections" value="1000" />
        <!--<property name="maxActive" value="300" />-->
        <!--<property name="maxWait" value="5000" />-->
              
      </dataSource>
    </environment>

正常にプーリングが効くはずなんですが、よく MySQL の JDBC が Too many connections でエラーを起こします。


Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
	at com.mysql.jdbc.Util.getInstance(Util.java:386)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
	at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1110)
	at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2465)
	at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2306)
	... 55 more

MySQL の my.ini (Windowsなので) の最大 300 にしていたのを、試しに 1000 に変更して、エラーの発生する処理 (連続1200レコードほどの INSERT) を行ったところ、

何故か、エラーなしに正常に処理が完了出来ました。

# The maximum amount of concurrent sessions the MySQL server will
# allow. One of these connections will be reserved for a user with
# SUPER privileges to allow the administrator to login even if the
# connection limit has been reached.
max_connections=1000

処理中、プロセス数を確認してみると、500位まで接続数が上昇し続け、アイドルなのが捨てられ、1桁に減りました。
MyBatis の問題か、connecter/J の問題かはわかりませんが、長年の??が解消しました。

MySQL mysqlコマンド (接続ステータス)

接続セッション一覧 : show processlist;

mysql> show processlist;
+-------+-----------------+-----------------+----------+---------+------+-----------------------------+------------------+
| Id    | User            | Host            | db       | Command | Time | State                       | Info             |
+-------+-----------------+-----------------+----------+---------+------+-----------------------------+------------------+
|     1 | event_scheduler | localhost       | NULL     | Daemon  |    9 | Waiting for next activation | NULL             |
| 67692 | root            | localhost       | ?????    | Query   |    0 | starting                    | show processlist |
| 68108 | root            | 127.0.0.1:43480 | ?????    | Sleep   |   21 |                             | NULL             |
| 68224 | root            | 127.0.0.1:43712 | ???????? | Sleep   |   29 |                             | NULL             |
| 68408 | root            | 127.0.0.1:45742 | ???????? | Sleep   |   24 |                             | NULL             |
+-------+-----------------+-----------------+----------+---------+------+-----------------------------+------------------+
5 rows in set (0.00 sec)

接続セッション数 : show status like ‘Threads_connected’; または SELECT COUNT(*) FROM information_schema.PROCESSLIST;

mysql> show status like 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 4     |
+-------------------+-------+
1 row in set (0.01 sec)

mysql> SELECT count(*) FROM information_schema.PROCESSLIST;
+----------+
| count(*) |
+----------+
|        5 |
+----------+
1 row in set (0.00 sec)

最大接続設定 : show global variables like ‘max_connections’;

mysql> show global variables like 'max_connections';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | ???   |
+-----------------+-------+
1 row in set (0.00 sec)

湯川秀樹 : 現実

現実は痛切である。

あらゆる甘さが排斥される。

現実は予想できぬ豹変をする。

あらゆる平衡は早晩打破せられる。

現実は複雑である。

あらゆる早合点は禁物である。