1

javaSE アプリケーションで約 1 年間正常に動作していたタスクがあります。つまり、SQLite データベースから BLOB とテキスト メタデータを抽出し、大きな RDBMS に入力します。

このタスクをWildflyに移したところ(10.0、昨日は10.1も試した)、おかしなことが起きた。非常に多くの場合、Wildfly は単独のメッセージで完全に死んでしまいます

java: src/main/java/org/sqlite/core/NativeDB.c:521: 
Java_org_sqlite_core_NativeDB_column_1blob: Assertion `jBlob' failed.
/opt/wildfly-10.1.0.Final/bin/standalone.sh: line 307: 36275 Aborted                 "java" -D"[Standalone]" -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true "-Dorg.jboss.boot.log.file=/opt/wildfly-10.1.0.Final/standalone/log/server.log" "-Dlogging.configuration=file:/opt/wildfly-10.1.0.Final/standalone/configuration/logging.properties" -jar "/opt/wildfly-10.1.0.Final/jboss-modules.jar" -mp "/opt/wildfly-10.1.0.Final/modules" org.jboss.as.standalone -Djboss.home.dir="/opt/wildfly-10.1.0.Final" -Djboss.server.base.dir="/opt/wildfly-10.1.0.Final/standalone"

他のすべての EJB、サーブレットなども動作を停止します。

sqlite ファイルを処理するシングルトン EJB は、try - catch でラップされていますが、役に立ちません。そのため、非常にイライラする問題です。

OS は CentOS7 で、最新のストック jre を使用しています。sqlite jdbc は 3.8.11.2 - 最新です。

ヒープを 1024 および 2048 メガバイトに増やそうとしましたが、役に立ちませんでした。

この問題を調査して解決するにはどうすればよいですか? javaSE に戻すことは望ましくありません。

このコードでブロブを取得します(try-catchでラップされ、その後nullをチェックします)

System.out.print("getting data... ");
byte[] rawData = rs.getBytes("data");
System.out.println("ok");

私がデバッグする限り、wildfly は getBytes() で死ぬわけではありません。コンソールで「データを取得しています... OK」と表示されるからです。その後、バイト配列のみで作業しますが、アサーション「jBlob」が失敗してワイルドフライが終了します

4

1 に答える 1

4

NativeDB.c でこの不幸なコードを見つけました。

length = sqlite3_column_bytes(toref(stmt), col);
jBlob = (*env)->NewByteArray(env, length);
assert(jBlob); // out-of-memory

したがって、さらに多くのメモリを指定して問題を解決するか、別の sqlite JDBC ドライバーを試すことができます。

このコード全体での使用をassert考えると、サーバーベースのソリューションの近くに置くべきではないと思います。アサーションが失敗した場合のデフォルトの動作はC、現在のプロセスを中止することです。

于 2016-09-27T06:32:02.513 に答える