- トップ >
- 製品・サービス >
- 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 |
対象となるタイプ | 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のドキュメントでの記載
フォーマットは同期化されません。スレッドごとに別のフォーマットインスタンスを作成することをお勧めします。複数のスレッドがフォーマットに同時にアクセスする場合は、外部的に同期化する必要があります。
● 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.0 | default_multi_narrow=size | multitext_narrow_3.1mode=false |
3.03 | default_multi_narrow=size | multitext_narrow_3.1mode=true |
3.1以降 | default_multi_narrow=size | multitext_narrow_3.1mode=true |