2016-09-27 89 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)驅動程序作爲替代。它會拋出異常,而不會因斷言失敗而崩潰 –