忍者ブログ

Javaってまだいけますか ログ

Javaってまだいけますか

いっぱいいっぱいで無理なので学んだ事をいちいちメモっていくブログです。

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

catch (Exception e)でErrorの捕捉が漏れる

アプリケーションで、「ここが全ての例外をハンドリングする最後の関所だ!」みたいなところで

try {

} catch (Exception e) {
// 最終ハンドリング
}


のようにしてExceptionで一括捕捉しようとすることがあるのですが、今さらながらこの場合Errorの捕捉が漏れてしまうことに気づきました。
例えば、以下のようなError。

・OutOfMemoryError
・StackOverflowError

通常、上記のErrorが発生したらもうアプリケーションではどうしようも無いですが、外部システムと連携しているシステムで困ったことがありました。

要は、

・自分とこのシステムはぜんぜん平気
・外部システムを呼び出したらOutOfMemoryErrorが帰ってきた

というようなケースでハンドリングすべき処理ができなかった、といったバグです。

こういった場合、
「外部システムを呼び出す処理においては、ExceptionとError、もしくは一括してThrowableでキャッチして、システム共通例外などに詰め込んで再スローする」
といった考慮が必要だと思いました。

あと、Throwable、Exception、Errorなどについてはこちらのブログ記事がとても参考になりました。
PR

プロジェクトリーダー的なプロジェクトメモ

プロジェクトを通じて感じたことをメモ。
(かなり走り書きです。)

つづきはこちら

[DB2]SQL0912N データベースに対するロック要求の最大数に達しました。

次のコマンドでlocklistを増やすといいようです。

db2 update db cfg for privacy_manager_db using LOCKLIST new_value

privacy_manager_db
Tivoli Privacy Manager が使用する DB2 インスタンスの名前
new_value
パラメーターに割り当てる値。 LOCKLIST のデフォルト値は 100。

参考にしたサイト

[DB2]接続中のセッションの確認

DB2が稼動しているサーバ上のDB2 CLP上で、以下のコマンドを実行することで確認できました。
set DB2INSTANCE=対象インスタンス名
db2 list application show detail

DB2でLPAD

DB2だとLAPD関数が無いのでFUNCTIONとして自作しました。

・指定文字で埋めるバージョン
CREATE FUNCTION LPAD (STR VARCHAR(128), LEN INTEGER, PAD VARCHAR(1))
RETURNS VARCHAR(128)
LANGUAGE SQL CONTAINS SQL
RETURN (
CASE WHEN LENGTH(RTRIM(STR)) < LEN THEN
REPEAT(PAD, LEN - LENGTH(RTRIM(STR))) || STR
ELSE
STR
END
);


・半角空白で埋めるバージョン
CREATE FUNCTION LPAD (STR VARCHAR(128), LEN INTEGER)
RETURNS VARCHAR(128)
LANGUAGE SQL CONTAINS SQL
RETURN (
CASE WHEN LENGTH(RTRIM(STR)) < LEN THEN
REPEAT(' ', LEN - LENGTH(RTRIM(STR))) || STR
ELSE
STR
END
);


ちなみに同じ名前で引数違いのFUNCTIONを作ったら、DROPのときはシグネチャを指定します。
DROP FUNCTION LPAD (VARCHAR(128), INTEGER, VARCHAR(1));
DROP FUNCTION LPAD (VARCHAR(128), INTEGER);

残念ながら、使うときは
スキーマ名.LPAD(カラム名, 桁数, '0')

のようにスキーマ名の修飾が必要です。

[DB2]テーブル/インデックスのメンテナンス

DB2の定期的なメンテナンスについてのメモ。
下記4つの手順をバッチファイルにしといて定期的に実行すると良いようです。

1.テーブルを再編成する
db2 REORG TABLE [スキーマ名].[テーブル名]

2.インデックスを再編成する
db2 REORG INDEXES ALL FOR TABLE [スキーマ名].[テーブル名] ALLOW NO ACCESS

3.統計情報再収集
RUNSTATS ON TABLE [スキーマ名].[テーブル名] AND INDEXES ALL

4.すべてのデータベース・パッケージを再バインド
set DB2INSTANCE=[データベース名]
db2rbind [データベース名] -l logfile.out ALL


※4はDBサーバ上で実行する必要があるっぽい。

再編成とはデフラグみたいなものっぽいです。
パッケージの再バインドというのがよく分からないんですが。。。

参考にしたサイト

フリーのデータベースモデリングツール

フリーでいい感じのモデリングツールを見つけたのでメモ。
Toad Data Modeler Freeware
ERMaster

Toad Data Modelerの方は実際に実務で使いましたが、かなりいい感じでした。
対応DBが多いです。
* PostgreSQL
* MySQL
* SQLServer
* Oracle
* DB2

英語だけど問題なく日本語の出力もでき、ER図のイメージエクスポートで成果物としても問題なし。
DDLやHTMLのレポートなども出せました。

有償版はリバースもできるみたいだけど、新規アプリの開発だったので問題なし。

あと、無償版はエンティティ数の制限があったんですが、定義ファイルを分けて(マスタ系とイベント系とか?)工夫すればなんとかなりました。
(でもファイルを超えて外部キーが定義できないんですが…。)

ERMasterの方は最近知ったんですが、フリーとは思えない性能ですね。次のプロジェクトで是非使ってみたいと感じました。

IEでリンクの背景に画像を指定した際のちらつきを防止する

IEでリンクの背景に画像を指定した場合、フォーカスを当てると画像の再読み込みが起こってちらつく場合の解決策を見つけたのでメモ。

CSSに、
html {
filter: expression(document.execCommand("BackgroundImageCache", false, true));
}

を記述すると、ちらつきが無くなりました。

参考にしたサイト

Unicode対応 文字コード表

文字コードが分かりやすくまとめられているサイトを見つけたのでメモ。

Shift_JIS、EUC_JP、UTF-8、UTF-16でそれぞれどのコードになるかを対比して見ることができるのでとてもいい感じです。

貴重な情報を公開していただいてとてもありがたいです。

文字コードについて

ついでにこっちもメモ。
機種依存文字について

JavaMailでjavax.mail.SessionがSingletonの罠(仕様ですけど)

JavaMailではまったのでメモ。

以下のようなメール送信クラスを作成してメール送信を行おうとしました。
import java.util.Date;
import java.util.Properties;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.commons.validator.GenericValidator;

public class Mailer {
private String smtpHost;

private String smtpPort;

private String fromAddress;

public Mailer(String smtpHost, String smtpPort, String fromAddress) {
this.smtpHost = smtpHost;
this.smtpPort = smtpPort;
this.fromAddress = fromAddress;
}

public void send(String to, String cc, String subject, String body) {

try {
// メール送信準備
Properties props = new Properties();
props.put("mail.smtp.host", smtpHost);
props.put("mail.smtp.port", smtpPort);
props.put("mail.host", smtpHost);

Session session = Session.getDefaultInstance(props, null);

// メール作成
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.addFrom(InternetAddress.parse(fromAddress));
mimeMessage.setRecipients(Message.RecipientType.TO, InternetAddress
.parse(to));
if (!GenericValidator.isBlankOrNull(cc)) {
mimeMessage.setRecipients(Message.RecipientType.CC,
InternetAddress.parse(cc));
}
mimeMessage.setSubject(subject, "iso-2022-jp");
mimeMessage.setText(body, "iso-2022-jp");
mimeMessage.setSentDate(new Date());

// 送信
Transport.send(mimeMessage, mimeMessage.getAllRecipients());

} catch (Exception e) {
e.printStackTrace();
}
}
}

で、コンストラクタで外部からSMTPホスト名とPORT名を与えて送信先メールサーバを切り替えようとしたけど、いくら外から設定しても最初に設定した送信先から切り替わらず・・・。

調べたところ、これが曲者でした。
Session session = Session.getDefaultInstance(props, null);

getDefaultInstanceがSessionのSingletonオブジェクトを返すようになっていた為、最初の設定がずっとキャッシュされてたんですね。。。

以下のように変えたら毎回設定が反映されるようになりました。
Session session = Session.getInstance(props);

※getInstanceの中身はSessionをnewして返してるだけ。

JavaMail

Navigation

Copyright ©  Javaってまだいけますか  All Rights Reserved.
  • 忍者ブログ
  • [PR]

menu

ブログ内検索

カテゴリー

カウンター

忍者アド

リンク

最新CM

[07/17 セバ]
[12/27 NONAME]

最新記事

(10/15)
(10/01)
(08/12)
(08/12)
(08/11)

プロフィール

HN:
takacy.k
年齢:
38
性別:
男性
誕生日:
1979/08/13
趣味:
自己紹介:
個人的なメモですので、投稿内容について真偽を保証するものではありません。また、当ブログの内容をご利用になったことによる(以下略)

最新TB

RSS

アーカイブ

アクセス解析