2016-09-27 63 views
1

我有一个任务,在javaSE应用程序中工作正常约一年。即:从sqlite数据库中提取blob和文本元数据并填充大型RDBMS。Wild being被sqlite杀死jdbc

当我把这个任务移动到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等都停止工作。

我的singleton EJB处理sqlite-files包装在try-catch中,但它没有帮助。所以这是非常令人沮丧的问题。

操作系统是CentOS7与最新股票jre。 sqlite jdbc是3.8.11.2 - 最新版本。

我试图增加堆1024和2048兆字节,它没有帮助。

我该如何调查和解决这个问题?回到javaSE是不可取的。

我得到的斑点与此代码(包裹在try-catch代码和检查后空)

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

至于我调试,wildfly不是死上的getBytes(),因为我可以看到 “获取数据...确定“在控制台中。从那以后,我与字节数组只工作,而是断言`jBlob wildfly死”失败

回答

3

我发现NativeDB.c这个不幸的一段代码:

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

因此,你可以尝试指定连更多的内存来尝试和解决问题,或者可能是一个不同的sqlite JDBC驱动程序。

鉴于在整个代码中使用了assert,我认为任何人都不应该让它靠近基于服务器的解决方案。 C声明失败的默认行为是中止当前进程。

+0

哇!好地方! –

+0

我怀疑增加JVM堆可能会以某种方式修复不整齐的C++代码。但是,谢谢你的回答,现在更清楚发生了什么事情!顺便说一句,我可以通过使用CentOS6解决问题。所以,可能它并不重要的Java SE/EE,但一些错误与最新的Java它略有不同1.8.0.101 vs 1.8.0.102 –

+0

也许看看[xerial sqlite jdbc](https://bitbucket.org/xerial/sqlite-jdbc)驱动程序作为替代。它会抛出异常,而不会因断言失败而崩溃 –