ブレインセラーズ・ドットコム | brainsellers.com

Brainsellers.com biz-Stream サポート情報


数値や日付について正しい値が出力しない

2004年01月20日

biz-Stream v3.0、v3.03、v3.1御利用の際に文字列以外のタイプ・クラスを使用していた場合、指定した値が正しく出力しない現象に関して説明いたします。
※ このトピックスの対象は biz-Stream v3.0、v3.03、v3.1を御利用のお客様のみです。

1.現象

PDFを生成する際にレイアウトに関連して指定するデータタイプ/クラスについて、文字列以外のタイプ/クラスを指定していた際に、以下の現象が発生する可能性があります。

a.生成したPDFの数値や日付について、指定したものと異なる値になってしまう。
b. java.text.DecimalFormatクラス内でエラーが発生してしまう。
(java.lang. ArrayIndexOutOfBoundsException)


2. 発生する条件

biz-Stream v3が稼動しているマルチスレッド対応のアプリケーション環境で、以下の様に文字列以外のデータタイプ・クラスを利用している場合に発生する可能性があります。

レイアウト・デザイナ等で作成したレイアウトファイル内に、文字列以外のデータタイプを指定している場合

対象となるタイプsmallint, integer, long, float, double, decimal, date, time, timestamp
非対象となるタイプchar, varchar


データの指定について、HashtableType()で生成したオブジェクトに対し、文字列以外のデータクラスで格納した場合

対象となるタイプShortType, IntType, LongType, FloatType, DoubleType, DateType,TimeType, TimestampType
非対象となるタイプStringType


3. 原因

biz-Stream v3では、「文字列以外のデータタイプ/クラスでPDF生成のための各種データを指定できる」ように機能が拡張されています。

a. XMLレイアウトファイルで、CSVやハッシュテーブル、RDBMSへのデータアクセス等が指定できます。
b. setDataSourceメソッドにより、biz-Streamへのデータの指定が柔軟にできます。

これらの機能を利用する際に、文字列以外のデータタイプ/クラスが指定されていた場合、または文字列以外のデータで出力する設定がされていた場合に、biz-Stream v3は内部でJDKのJava.text.DecimalFormatクラス等を拡張した独自のフォーマットクラスを使用してデータタイプの変換を行っています。

本現象は、あるスレッドが独自クラスを使用してデータを変換している途中で、別のスレッドが変換をする際に、最初のスレッドのデータが書き換えられてしまうという現象です。マルチスレッドに対して保護されていない、同期化されていないという「スレッドセーフではない状態」のために発生します。

発生頻度は、アプリケーションの実行頻度やマルチCPU環境下等様々な要因により影響を受けます。

この「スレッドセーフではない」現象ですが、独自クラスのベースであるJDKのJava.text.Decimal.Formatクラス自身がスレッドセーフでないことに端を発しています。

当該クラスが「スレッドセーフでない」件ですが、JDK 1.4.0では製品不具合としてBug Databaseに投稿されていたものです。最新のJDK 1.4.0以降より、APIドキュメントにその旨が明記されており、現時点では仕様として扱われています。これは、パフォーマンスに影響を与える懸念があり、必要に応じて上位アプリケーションで対応するということです。

<JDK 1.4.0のドキュメントでの記載>
フォーマットは同期化されません。スレッドごとに別のフォーマットインスタンスを作成することをお勧めします。複数のスレッドがフォーマットに同時にアクセスする場合は、外部的に同期化する必要があります。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/index.htmlからの抜粋)

<Bug Databaseへの投稿スレッド>
http://developer.java.sun.com/developer/bugParade/bugs/4101500.html
http://developer.java.sun.com/developer/bugParade/bugs/4264153.html


4. 対策

biz-Stream v3のホットフィックス3.10Gにより修正を行いました。このため、biz-Stream v3.2へのリリースアップ又はv4へのバージョンアップを行ってください。

また、その際にプロパティファイル修正の際、次表の設定についても必ず確認のうえ反映願います。

現在の
バージョン
default_values.properties
ファイル
xml_compatible.properties
ファイル
3.0default_multi_narrow=sizemultitext_narrow_3.1mode=false
3.03default_multi_narrow=sizemultitext_narrow_3.1mode=true
3.1以降default_multi_narrow=sizemultitext_narrow_3.1mode=true

ページの先頭へ

copyright©2005 brainsellers.com Corp. All rights reserved.