Tomcat9 JNDIデータソースの設定

プーリングコネクションするJNDIの設定を、server.xml に記述します。

[ 設定例 MySQL ]


      <Resource 
      driverClassName="com.mysql.jdbc.Driver" 
      maxActive="300" 
      maxIdle="100" 
      maxWait="5000" 
      name="jdbc/DATABASE_NAME" 
      password="??????" 
      type="javax.sql.DataSource" 
      url="jdbc:mysql://localhost:3306/DATABASE_NAME?characterEncoding=utf8&amp;autoReconnect=true&amp;useSSL=false" 
      username="??????" 
      
      validationQuery="select 1"
      testOnBorrow="true"
      testWhileIdle="true"
      timeBetweenEvictionRunsMillis="60000"
      />

5.7系にバージョンアップした時、はまったのですが、非リモートサーバーのデータベースの場合、urlに useSSL=false を入れる必要あります。(ないと劇遅)
Oracleの中の人に教えてもらったのですが、同一ホスト内の場合、127.0.0.1 より localhost が速いそうです。

[ 設定例 Firebird ]


    <Resource
      name="jdbc/DATABASE_NAME"
      type="javax.sql.DataSource"
      driverClassName="org.firebirdsql.jdbc.FBDriver"
      password="????????"
      maxIdle="40"
      maxWait="5000"
      username="????????"
      url="jdbc:firebirdsql:localhost/3050:DATABASE_NAME?lc_ctype=SJIS_0208"
      maxActive="100"
      
    />

[ 設定例 Oracle ]


    <Resource
      name="jdbc/SID_NAME"
      type="javax.sql.DataSource"
      driverClassName="oracle.jdbc.driver.OracleDriver"
      password="SID_NAME"
      maxIdle="40"
      maxWait="5000"
      username="????????"
      url="jdbc:oracle:thin:@???.???.???.???:1521:SID_NAME"
      maxActive="100"/>

[ 設定例 PostgreSQL ]


    <Resource
      name="jdbc/DBNAME"
      type="javax.sql.DataSource"
      driverClassName="org.postgresql.Driver"
      password="???????"
      maxIdle="40"
      maxWait="5000"
      username="??????"
      url="jdbc:postgresql://127.0.0.1/DBNAME"
      maxActive="100"/>

[ 設定例 SQLServer ]


     <Resource
      name="jdbc/DBNAME"
      type="javax.sql.DataSource"
      driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
      password="??????"
      maxIdle="40"
      maxWait="5000"
      username="??????"
      url="jdbc:sqlserver://???.????.???.???:1433;DatabaseName=DBNAME"
      maxActive="100" />

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

Tomcatハンドブック
価格:5170円(税込、送料無料) (2023/1/11時点)

sqlite3 出来ないことのまとめ


本家リンク

直ぐに使えて、ちょっとしたデータ管理には便利な sqlite ですが、他のデータベースと同じように使うには無理で、機能がない部分が多いです。

  1. 認証がなく、ユーザーがない
  2. 他ホストからの接続ができない
  3. 同時多数接続大量処理 (テーブルがロックして更新出来ないことがある)
  4. CURRENT_TIMESTAMP がないので、関数を使う
  5. 列の削除ができない (ALTER TABLE tablename DROP columnname)
  6. ストアドプロシージャーがない (トリガーはある)
  7. 文字長がない (文字列型は全部 Text にする)
  8. 数値型が少ない (INTEGER, REAL, NUMERIC だけ)
  9. TRANCATE TABLE
  10. LEFT OUTER JOIN
  11. ALL, ANY

 

MySQL information_schema の活用 テーブルステータス

information_schema にある TABLES から現在の状態を取得できます。

下のようなビューを使って、わかりやすくしてます。


CREATE 
    ALGORITHM = UNDEFINED 
    DEFINER = `root`@`localhost` 
    SQL SECURITY DEFINER
VIEW `vw_simple_table_schema` AS
    SELECT 
        `information_schema`.`tables`.`TABLE_NAME` AS `Name`,
        `information_schema`.`tables`.`TABLE_COMMENT` AS `Comment`,
        `information_schema`.`tables`.`TABLE_ROWS` AS `Rows`,
        (FLOOR((`information_schema`.`tables`.`DATA_LENGTH` / 1024)) + FLOOR((`information_schema`.`tables`.`INDEX_LENGTH` / 1024))) AS `total_length_k`,
        FLOOR((`information_schema`.`tables`.`DATA_LENGTH` / 1024)) AS `Data_length_k`,
        FLOOR((`information_schema`.`tables`.`INDEX_LENGTH` / 1024)) AS `index_length_k`,
        `information_schema`.`tables`.`CREATE_TIME` AS `Create_time`
    FROM
        `information_schema`.`tables`
    WHERE
        (`information_schema`.`tables`.`TABLE_SCHEMA` = 'ocean2')
    ORDER BY `information_schema`.`tables`.`TABLE_ROWS` DESC

各アプリケーションの管理人用ページに、下のような表を配置してます。

運航港地図 と 施設港地図

googleMap利用の港地図です。

< リンク >

施設港地図

運航港地図

< 画面絵 >

運航港地図

施設港地図

< ご利用上の注意 >

運航港地図を船舶運航業務等で利用された結果生ずる、いかなる有形無形の損害については、開発者は一切の責任を負わないこととします。

データ内容につきましては、出来る限り最新の状況に追従させてますが、間に合わないこともあり、ご容赦下さい。

ケータイ用インドネシア語辞書

昔、インドネシア語を勉強してた時期があり、ふさわしい電子辞書がないので、自作しました。
国内でインドネシア語を勉強してる人、日本人インドネシア駐在員の方々、在日インドネシア人の人達にご好評で、一時期、多数のアクセスがありましたが、最近はガラケー利用者が少ないのか、時代遅れなのか、過疎な状態です。

URL : 2020年3月リニューアルしました

特徴としては、

1) 印 => 日 検索で、ローマ字が出る
2) 日 => 印 検索で、ひらがな、ローマ字が使える
3) 検索結果を一時的に記憶して、一覧で見れる

だけです。

上画面例訳語を見て、初めて知った言葉、polisi tidur は、警察 : 睡眠 が日本語訳になり、面白い表現で少し笑えます。

辞書データは下サイトの運営者作成のを、使わせて頂いてます。

http://www.geocities.jp/indo_ka/bahasa/id_soft.htm

MySQL CSV文字列位置指定取得

よく使うので、関数にしてます。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_csv_idxtxt_int`(
	`src` varchar(300),
	`idx` smallint

)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'CSV列指定位置取得'
begin

declare rtnvalcsv int;

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(src, ',', idx), ',', -1) INTO rtnvalcsv;

return rtnvalcsv;

end

MySQL 日付指定年齢関数

誕生年月日を渡せば、今日の年齢を返します。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_age_by_birthdate`(
	`bdate` date

)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '日付値指定年齢取得スカラー関数'
begin
  declare agetoday int;
  select year(current_date) - year(bdate) - (right(current_date, 5) < right(bdate, 5)) into agetoday;
  return agetoday;
  
end

DATE型値をキャストなしで部分文字列取得できます。

下は今日以外を指定した年齢取得


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_age_by_birthdate_tgtdt`(
	`bdate` date,
	`tgtdt` date
)
RETURNS int(11)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '日付値指定年齢取得スカラー関数'
begin
  declare agetoday int;
  select year(tgtdt) - year(bdate) - (right(tgtdt, 5) < right(bdate, 5)) into agetoday;
  return agetoday;
  
end

[ 利用場面 ]

MySQL 記号除去関数

各社から提供されるデータの船名を結合させて処理する時、船名内の記号、スペースの扱いがまちまちで、使えないので作ってみました。
正規表現使えば、すっきりして、新規出現にも対応できると思いますが、今のところ支障なく使えてるので、不都合に遭遇したら、作り変えます。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_extract_symbol`(
	`src` varchar(250)

)
RETURNS varchar(250) CHARSET utf8
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '記号除去関数'
begin

return
replace(replace(replace(replace(replace(replace(replace(src, ' ', ''), '*', ''), '.', ''), '-', ''), ',', ''), '(', ''), ')', '');

end

MySQL 言語指定曜日スカラー関数

昔、MySQLで初めて作った、ユーザー定義関数です。
言語を付け足していけば、拡張できます。RETURNS の CHARSET は必要に応じて変更してください。


CREATE DEFINER=`root`@`localhost` FUNCTION `fc_dofwtxt`(
	`idx` tinyint,
	`langcd` varchar(4)

)
RETURNS varchar(20) CHARSET sjis
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT '言語指定曜日文字列スカラー関数'
begin
  declare res varchar(12);
  
  if (langcd = 'jp') THEN
  	select 
  	  case (idx)
  	  when 2 then '月'
  	  when 3 then '火'
  	  when 4 then '水'
  	  when 5 then '木'
  	  when 6 then '金'
  	  when 7 then '土'
  	  when 1 then '日'
  		end as restxt into res;
  
  END IF;
  
  if (langcd = 'jpp') THEN
  	select 
  	  case (idx)
  	  when 2 then '(月)'
  	  when 3 then '(火)'
  	  when 4 then '(水)'
  	  when 5 then '(木)'
  	  when 6 then '(金)'
  	  when 7 then '(土)'
  	  when 1 then '(日)'
  		end as restxt into res;
  
  END IF; 
	
  if (langcd = 'ens') THEN
  	select 
  	  case (idx)
  	  when 2 then 'Mon'
  	  when 3 then 'Tue'
  	  when 4 then 'Wed'
  	  when 5 then 'Thu'
  	  when 6 then 'Fri'
  	  when 7 then 'Sat'
  	  when 1 then 'Sun'
  		end as restxt into res;
  
  END IF; 
	
  if (langcd = 'cnp') THEN
  	select 
  	  case (idx)
  	  when 2 then '(星期一)'
  	  when 3 then '(星期二)'
  	  when 4 then '(星期三)'
  	  when 5 then '(星期四)'
  	  when 6 then '(星期五)'
  	  when 7 then '(星期六)'
  	  when 1 then '(星期天)'
  		end as restxt into res;
  
  END IF;  		 	
	 
  
  return res;
end

Firebird の特徴

Firebird 日本ではあまり使われてませんが、海外ではMySQL, PostgreSQL と同じ位使われ、三大OSSデータベースのひとつと言われてます。
特徴、列挙すると、

1) 管理が少なく、ほっておいても雑草のようにちゃんと動く
2) プアな環境でも動き、ハードコスト、利用コストを抑えられる
3) 一通りの機能は揃っていて、他DBからの移行も容易
4) トリガ、ストアド、ストアド導出テーブル、ユーザー定義関数、揃っていて海外ではスモールオラクルと言われてる
5) データベース毎にファイルが1個で管理しやすい
6) Windowsでも使いやすい
7) SQLが標準に近く、くせが少ない
8) サーバー用のsuper serverと組込用のclassic server に別れ、組込用途で使いやすい
9) 文字コードの対応が豊富
10) インストール容量が小さく、すぐに準備出来る
11) 自作UDFを組み込める
12) 日本語の情報は少ないが、外国語のは多く、ロシア語、ポルトガル語、インドネシア語の情報が多い
13) IDEが豊富にあり、好みで選べる
14) コマンドラインの isql で mysql, psql と同等の事が出来、ステータス確認用SQLも普通に揃ってる
15) チューニング項目が少なく、何もしなくても高パフォーマンスが得られる

本家 Home : https://firebirdsql.org/

IBPhoenix : https://www.ibphoenix.com/

Wikipedia : https://ja.wikipedia.org/wiki/Firebird

日本ユーザー会 : http://tech.firebird.gr.jp/firebird/index.php?firebird_xsite=0

キムラデービーブログ : http://blog.kimuradb.com/