1

我有一项任务在 javaSE 应用程序上运行了大约一年。即:从 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、servlet 等也停止工作。

我的处理 sqlite 文件的单例 EJB 包含在 try-catch 中,但它没有帮助。所以这是一个非常令人沮丧的问题。

操作系统是 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() 上死掉,因为我可以在控制台中看到“正在获取数据……好的”。之后我只使用字节数组,但wildfly因断言'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 回答