纯Java与本机SQLiteJDBC驱动程序和嵌套VM

纯Java与本机SQLiteJDBC驱动程序和嵌套VM,java,sqlite,jdbc,native,Java,Sqlite,Jdbc,Native,我目前正在使用Weblogic中托管的Java web应用程序和SQLite DB开发一个非常简单的projet。范围很小,只有两张桌子 开发进行得很顺利,但在部署到staging时,我遇到了一些意想不到的问题 每当应用程序必须从DB读取select时,我都可以读取以下堆栈跟踪: Root cause of ServletException.java.lang.Error: in _syscall() at org.ibex.nestedvm.Runtime.syscall(Runti

我目前正在使用Weblogic中托管的Java web应用程序和SQLite DB开发一个非常简单的projet。范围很小,只有两张桌子

开发进行得很顺利,但在部署到staging时,我遇到了一些意想不到的问题

每当应用程序必须从DB读取select时,我都可以读取以下堆栈跟踪:

Root cause of ServletException.java.lang.Error:  in _syscall()
    at org.ibex.nestedvm.Runtime.syscall(Runtime.java:1086)
    at org.sqlite.SQLite.run_0x171800(target/build/SQLite.mips:???)
    at org.sqlite.SQLite.trampoline(target/build/SQLite.mips:???)
    at org.sqlite.SQLite._execute(target/build/SQLite.mips:???)
    at org.ibex.nestedvm.Runtime.__execute(Runtime.java:506)
    at org.ibex.nestedvm.Runtime.call(Runtime.java:678)
    at org.ibex.nestedvm.Runtime.call(Runtime.java:647)
    at org.sqlite.NestedDB.call(NestedDB.java:568)
    at org.sqlite.NestedDB.call(NestedDB.java:563)
    at org.sqlite.NestedDB.prepare(NestedDB.java:130)
    at org.sqlite.DB.prepare(DB.java:123)
    at org.sqlite.Stmt.executeQuery(Stmt.java:121)
如果我错了,请告诉我,但我理解的是target/build/SQLite.mips是指驱动程序的本机实现。但是,我确实指定它应该使用纯java:

Connection con;

//Load the JDBC driver class dynamically.
Driver d = (Driver)Class.forName("org.sqlite.JDBC").newInstance();
DriverManager.registerDriver(d);

//init the connection
System.setProperty("sqlite.purejava", "true");          
con = DriverManager.getConnection(getConnectionString());
我的理解正确吗?如何进一步加强纯java实现的使用? 还有什么会导致这样的堆栈跟踪吗

为了记录在案,dev和stagging环境都是linux/beaweblogic


感谢您的时间:

根据stacktrace中的类名,我假设您使用的是XerialJ JDBC驱动程序,不是有点旧了吗

根据它,您应该在加载JDBC驱动程序之前设置该属性

System.setProperty("sqlite.purejava", "true");
Class.forName("org.sqlite.JDBC"); 
您是在加载驱动程序后但在连接设置之前进行设置的。请按以下方式更改初始化顺序,然后重试:

//Load the JDBC driver class dynamically.
System.setProperty("sqlite.purejava", "true");          
Driver d = (Driver)Class.forName(driver).newInstance();
DriverManager.registerDriver(d);

//init the connection

con = DriverManager.getConnection(getConnectionString());

正如我们在评论中所说的,这就是我们所发现的

尽管有人明确指出NFS和SQLite不能很好地结合在一起,但有限的写操作和对来自3台机器的并发读取访问的需求迫使我们将两者结合起来

问题是缺少一个负责通过NFS并发访问文件共享的服务。Dev env让它运行,而staging没有


谢谢大家抽出时间

为什么要使用SQLite而不是H2?团队在嵌入式DB方面几乎没有经验。SQLite是我们最了解的。此外,我们公司的政策非常严格,默认情况下,我们将采用完整的oracle。我们很难获得SQLite的批准,想象一下他们不太了解的事情……您在加载JDBC驱动程序之前设置了这个属性吗?否则,当使用-Dsqlite.purejava=trueI调用JVM时,您可能希望尝试设置它。我刚刚编辑了我的问题,以便在setProperty周围显示更多代码。我将尝试看看是否可以更改启动weblogic的工具链。然而,我可以告诉你,我并没有把这个设置放在JVM启动的开发环境中,请看我的答案。你应该在加载驱动程序之前设置属性。我正在尝试,一旦发现问题,我会尽快通知你:它有那么旧吗?无论如何,这个项目并不年轻,我一直在修改1998-2005年的java或VBclasses@Gruck老实说,我没有使用它,但我很惊讶,我在谷歌的第一个结果中只得到了svn存储库,而不是一个官方页面,而它的父项目有一个官方页面,看起来变化不大。同样的行为。@Gruck,据我现在所知,NestedDB是纯java实现。这里的Pure意味着它不直接调用native,而是调用将C/C++代码转换为Java二进制代码的NestedVM??我仍然认为本地调用将在某种程度上完成。无论如何,我很抱歉,我不能再帮你了。文档中有断开的链接,所以我不确定整个设置是如何工作的。无论如何,感谢您的时间。尝试在JVM启动时添加该选项,但没有太大变化。