Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Derby Apache随机NullPointerException_Java_Sql_Derby - Fatal编程技术网

Java Derby Apache随机NullPointerException

Java Derby Apache随机NullPointerException,java,sql,derby,Java,Sql,Derby,我们在使用嵌入式ApacheDerby时遇到问题。无明显原因发生空指针异常。代码使用EmbeddedSimpleDataSource类访问数据库,并使用语句执行查询 应用程序运行在java基础Primi/CDC 1.1(使用CVM而不是JVM),内嵌版本为DeBe < /P> 奇怪的是,这个问题完全是随机的(至少对我们来说,我们还不能重现它)。从下面的日志中可以看到,异常发生在一个非常简单的select查询上 有时我们会出现3次或3次异常,然后一切都会恢复正常。(对数据库的后续调用很少失败,重

我们在使用嵌入式ApacheDerby时遇到问题。无明显原因发生空指针异常。代码使用EmbeddedSimpleDataSource类访问数据库,并使用语句执行查询

<强>应用程序运行在java基础Primi/CDC 1.1(使用CVM而不是JVM),内嵌版本为DeBe<强> < /P> 奇怪的是,这个问题完全是随机的(至少对我们来说,我们还不能重现它)。从下面的日志中可以看到,异常发生在一个非常简单的select查询上

有时我们会出现3次或3次异常,然后一切都会恢复正常。(对数据库的后续调用很少失败,重新获得访问权限的唯一方法是重新启动应用程序(有时我们甚至必须删除数据库文件夹并重新创建它))

下面是derby日志文件的摘录:

   Tue Oct 01 22:51:51 CEST 2013:
Booting Derby version The Apache Software Foundation - Apache Derby - 10.10.1.1 - (1458268): instance c013800d-0141-75ca-8140-000000068414 
on database directory /mnt/nand/lu/smarthubdb with class loader sun.misc.Launcher$AppClassLoader[ucp=sun.misc.URLClassPath[path=file:/mnt/nand/lu/SmartHub.jar],parent=sun.misc.Launcher$ExtClassLoader[ucp=sun.misc.URLClassPath[path=file:/usr/lib/ext/API_3.05.jar,file:/usr/lib/ext/sunjce_provider.jar],parent=null]] 
Loaded from file:/mnt/nand/lu/lib/derby.jar
java.vendor=Sun Microsystems Inc.
user.dir=/mnt/nand/lu
os.name=Linux
os.arch=sh3
os.version=2.6.25.9-svn298-dirty2
derby.system.home=null
Database Class Loader started - derby.database.classpath=''
Wed Oct 02 05:53:23 CEST 2013 Thread[main,5,main] (XID = 33536), (SESSIONID = 3), (DATABASE = smarthubdb), (DRDAID = null), Cleanup action starting
Wed Oct 02 05:53:23 CEST 2013 Thread[main,5,main] (XID = 33536), (SESSIONID = 3), (DATABASE = smarthubdb), (DRDAID = null), Failed Statement is: SELECT device.serial_number, tariff,reference_power_active, overload_power_limit_active, breaker_state,logical_device_type.name FROM device, logical_device_type WHERE device.id_logical_device_type = logical_device_type.id AND serial_number='041068350153'
java.lang.NullPointerException
    at org.apache.derby.exe.ac601a400fx0141x75cax8140x00000006841480.createResultSet(Compiled Method)(Unknown Source)
    at org.apache.derby.impl.sql.execute.CursorActivation.decorateResultSet(Unknown Source)
    at org.apache.derby.impl.sql.execute.BaseActivation.execute(Unknown Source)
    at org.apache.derby.impl.sql.GenericActivationHolder.execute(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Compiled Method)(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Compiled Method)(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.execute(Compiled Method)(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(Unknown Source)
    at com.s.g.a.c(Unknown Source)
    at com.s.g.a.a(Unknown Source)
    at com.s.g.b.a(Unknown Source)
    at com.s.statemachine.b.e.b(Unknown Source)
    at com.s.statemachine.b.i.c(Compiled Method)(Unknown Source)
    at com.s.statemachine.SmartHub.A(Compiled Method)(Unknown Source)
    at com.s.statemachine.SmartHub.a(Unknown Source)
    at com.s.statemachine.SmartHub.main(Unknown Source)
    at sun.misc.CVM.runMain(Unknown Source)
Cleanup action completed
Wed Oct 02 06:15:26 CEST 2013 Thread[main,5,main] (XID = 34359), (SESSIONID = 7), (DATABASE = smarthubdb), (DRDAID = null), Cleanup action starting
Wed Oct 02 06:15:26 CEST 2013 Thread[main,5,main] (XID = 34359), (SESSIONID = 7), (DATABASE = smarthubdb), (DRDAID = null), Failed Statement is: SELECT device.serial_number, tariff,reference_power_active, overload_power_limit_active, breaker_state,logical_device_type.name FROM device, logical_device_type WHERE device.id_logical_device_type = logical_device_type.id AND serial_number='041067350131'
java.lang.NullPointerException
    at org.apache.derby.exe.ac601a400fx0141x75cax8140x00000006841485.createResultSet(Compiled Method)(Unknown Source)
    at org.apache.derby.impl.sql.execute.CursorActivation.decorateResultSet(Unknown Source)
    at org.apache.derby.impl.sql.execute.BaseActivation.execute(Unknown Source)
    at org.apache.derby.impl.sql.GenericActivationHolder.execute(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.executeStmt(Compiled Method)(Unknown Source)
    at org.apache.derby.impl.sql.GenericPreparedStatement.execute(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.executeStatement(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.execute(Compiled Method)(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedStatement.executeQuery(Unknown Source)
    at com.s.g.a.c(Unknown Source)
    at com.s.g.a.a(Unknown Source)
    at com.s.g.b.a(Unknown Source)
    at com.s.statemachine.b.e.b(Unknown Source)
    at com.s.statemachine.b.i.c(Compiled Method)(Unknown Source)
    at com.s.statemachine.SmartHub.A(Compiled Method)(Unknown Source)
    at com.s.statemachine.SmartHub.a(Unknown Source)
    at com.s.statemachine.SmartHub.main(Unknown Source)
    at sun.misc.CVM.runMain(Unknown Source)
Cleanup action completed
以下是表格的结构:

private final static String               MCS_TABLE      = "metering_campaign_strategy";
private final static String[]             MCS_COLS       = { "serial_number",
            "measure_kind", "frequencyUnit", "frequency", "begin_date", "end_date", "last_retrieve_date" };
private final static String[]             MCS_COLS_TYPES = { "varchar(40) NOT NULL",
            "varchar(15) NOT NULL", "varchar(10) NOT NULL", "integer", "timestamp NOT NULL", "timestamp", "timestamp" }
)

如您所见,出现问题的表是通过编程方式创建的

我添加了DumpClassFile选项,一旦得到结果,我将立即更新此帖子

根据要求,下面是数据库的模式

Wed Oct 02 18:53:14 CEST 2013 Thread[main,5,main] (XID = 165), (SESSIONID = 0), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:14 CEST 2013 Thread[main,5,main] (XID = 165), (SESSIONID = 0), (DATABASE = smarthubdb), (DRDAID = null), Rolling back
Wed Oct 02 18:53:14 CEST 2013 Thread[main,5,main] (XID = 166), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:15 CEST 2013 Thread[main,5,main] (XID = 167), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE device (serial_number varchar(40), id_logical_device_type integer, tariff varchar(16), reference_power_active integer, overload_power_limit_active integer, breaker_state integer) :End prepared statement
Wed Oct 02 18:53:21 CEST 2013 Thread[main,5,main] (XID = 167), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE device (serial_number varchar(40), id_logical_device_type integer, tariff varchar(16), reference_power_active integer, overload_power_limit_active integer, breaker_state integer) :End prepared statement
Wed Oct 02 18:53:22 CEST 2013 Thread[main,5,main] (XID = 167), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE device (serial_number varchar(40), id_logical_device_type integer, tariff varchar(16), reference_power_active integer, overload_power_limit_active integer, breaker_state integer) :End prepared statement
Wed Oct 02 18:53:23 CEST 2013 Thread[main,5,main] (XID = 167), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:24 CEST 2013 Thread[main,5,main] (XID = 171), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE measure (id_device varchar(40) NOT NULL, date timestamp NOT NULL, value decimal(12,2), type integer, sent boolean) :End prepared statement
Wed Oct 02 18:53:24 CEST 2013 Thread[main,5,main] (XID = 171), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE measure (id_device varchar(40) NOT NULL, date timestamp NOT NULL, value decimal(12,2), type integer, sent boolean) :End prepared statement
Wed Oct 02 18:53:24 CEST 2013 Thread[main,5,main] (XID = 171), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE measure (id_device varchar(40) NOT NULL, date timestamp NOT NULL, value decimal(12,2), type integer, sent boolean) :End prepared statement
Wed Oct 02 18:53:26 CEST 2013 Thread[main,5,main] (XID = 171), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:27 CEST 2013 Thread[main,5,main] (XID = 184), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE message (id_device varchar(40) NOT NULL, date integer, message varchar(100)) :End prepared statement
Wed Oct 02 18:53:27 CEST 2013 Thread[main,5,main] (XID = 184), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE message (id_device varchar(40) NOT NULL, date integer, message varchar(100)) :End prepared statement
Wed Oct 02 18:53:27 CEST 2013 Thread[main,5,main] (XID = 184), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE message (id_device varchar(40) NOT NULL, date integer, message varchar(100)) :End prepared statement
Wed Oct 02 18:53:27 CEST 2013 Thread[main,5,main] (XID = 184), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:28 CEST 2013 Thread[main,5,main] (XID = 187), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE logical_device_type (id integer, name varchar(100)) :End prepared statement
Wed Oct 02 18:53:28 CEST 2013 Thread[main,5,main] (XID = 187), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE logical_device_type (id integer, name varchar(100)) :End prepared statement
Wed Oct 02 18:53:28 CEST 2013 Thread[main,5,main] (XID = 187), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE logical_device_type (id integer, name varchar(100)) :End prepared statement
Wed Oct 02 18:53:28 CEST 2013 Thread[main,5,main] (XID = 187), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:29 CEST 2013 Thread[main,5,main] (XID = 193), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE load_curve (id_device varchar(40) NOT NULL, date timestamp NOT NULL, value integer, error integer, sent boolean) :End prepared statement
Wed Oct 02 18:53:29 CEST 2013 Thread[main,5,main] (XID = 193), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE load_curve (id_device varchar(40) NOT NULL, date timestamp NOT NULL, value integer, error integer, sent boolean) :End prepared statement
Wed Oct 02 18:53:29 CEST 2013 Thread[main,5,main] (XID = 193), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE load_curve (id_device varchar(40) NOT NULL, date timestamp NOT NULL, value integer, error integer, sent boolean) :End prepared statement
Wed Oct 02 18:53:29 CEST 2013 Thread[main,5,main] (XID = 193), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:29 CEST 2013 Thread[main,5,main] (XID = 196), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE load_curve_last_collect (id_device varchar(40) NOT NULL, date timestamp NOT NULL) :End prepared statement
Wed Oct 02 18:53:30 CEST 2013 Thread[main,5,main] (XID = 196), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE load_curve_last_collect (id_device varchar(40) NOT NULL, date timestamp NOT NULL) :End prepared statement
Wed Oct 02 18:53:30 CEST 2013 Thread[main,5,main] (XID = 196), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE load_curve_last_collect (id_device varchar(40) NOT NULL, date timestamp NOT NULL) :End prepared statement
Wed Oct 02 18:53:30 CEST 2013 Thread[main,5,main] (XID = 196), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:30 CEST 2013 Thread[main,5,main] (XID = 199), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE tariff (type integer, name varchar(100)) :End prepared statement
Wed Oct 02 18:53:30 CEST 2013 Thread[main,5,main] (XID = 199), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE tariff (type integer, name varchar(100)) :End prepared statement
Wed Oct 02 18:53:30 CEST 2013 Thread[main,5,main] (XID = 199), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE tariff (type integer, name varchar(100)) :End prepared statement
Wed Oct 02 18:53:31 CEST 2013 Thread[main,5,main] (XID = 199), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:31 CEST 2013 Thread[main,5,main] (XID = 202), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE state_configuration (state_name varchar(50), last_execution timestamp) :End prepared statement
Wed Oct 02 18:53:31 CEST 2013 Thread[main,5,main] (XID = 202), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE state_configuration (state_name varchar(50), last_execution timestamp) :End prepared statement
Wed Oct 02 18:53:31 CEST 2013 Thread[main,5,main] (XID = 202), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE state_configuration (state_name varchar(50), last_execution timestamp) :End prepared statement
Wed Oct 02 18:53:31 CEST 2013 Thread[main,5,main] (XID = 202), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing
Wed Oct 02 18:53:32 CEST 2013 Thread[main,5,main] (XID = 205), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Begin compiling prepared statement: CREATE TABLE metering_campaign_strategy (serial_number varchar(40) NOT NULL, measure_kind varchar(15) NOT NULL, frequencyUnit varchar(10) NOT NULL, frequency integer, begin_date timestamp NOT NULL, end_date timestamp, last_retrieve_date timestamp) :End prepared statement
Wed Oct 02 18:53:32 CEST 2013 Thread[main,5,main] (XID = 205), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), End compiling prepared statement: CREATE TABLE metering_campaign_strategy (serial_number varchar(40) NOT NULL, measure_kind varchar(15) NOT NULL, frequencyUnit varchar(10) NOT NULL, frequency integer, begin_date timestamp NOT NULL, end_date timestamp, last_retrieve_date timestamp) :End prepared statement
Wed Oct 02 18:53:32 CEST 2013 Thread[main,5,main] (XID = 205), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Executing prepared statement: CREATE TABLE metering_campaign_strategy (serial_number varchar(40) NOT NULL, measure_kind varchar(15) NOT NULL, frequencyUnit varchar(10) NOT NULL, frequency integer, begin_date timestamp NOT NULL, end_date timestamp, last_retrieve_date timestamp) :End prepared statement
Wed Oct 02 18:53:33 CEST 2013 Thread[main,5,main] (XID = 205), (SESSIONID = 1), (DATABASE = smarthubdb), (DRDAID = null), Committing

谢谢

这是一个调试挑战,因为在执行查询时,崩溃发生在生成的代码中

在您的查询中,生成的代码可能正在计算限制谓词(其中serial_number='04116970007'和measure_kind='INDEX'))

首先,这里有一些关于如何进一步了解生成的代码内部内容的信息:

问题似乎是间歇性出现的,这一事实使问题变得更加困难,因为如果没有可重复的案例,您将很难跟踪和解决错误

您的应用程序是单线程的吗?还是有多个线程在运行

您是否检查过资源不足问题?JVM内存不足、磁盘空间不足等

可能值得考虑的一件事是Derby语句缓存是否会发挥作用。禁用缓存是否会影响问题

您提到数据库模式(表、索引等)是动态创建的。您能否更新您的问题以包含确切的模式信息?一种方法是在运行应用程序后对数据库运行“dblook”。或者使用'-Dderby.language.logStatementText=true'运行应用程序,所有执行的SQL语句都应回显到日志中


如果你自己还没有取得很大进展,你可以尝试联系Apache邮件列表上的Derby社区,因为他们会给你更多的建议。问题只是你有一些数据是空的,因为某些时候你没有识别,而其他时候你没有识别

如果此数据来自数据库,则使所有列
不可为空
将显示插入
NULL
数据的位置

如果数据来自您的模型代码,那么您可以使用JSR 305库从中注释所有方法签名中的
@Nonnull
,您将找到传递
NULL
引用的位置


从长远来看,这两种方法都会提高代码的可维护性和质量。

您使用的是连接池吗?你能从中得到一个过时的连接吗?不,我们没有使用连接池。Connection对象保存与数据库的连接,并用于获取一个语句对象,该对象在整个跟踪中执行queyrIs this?从跟踪开始到第一个数据库活动之间有15分钟的时间。如果在应用程序启动后很快访问数据库会发生什么?!是的,这是整个痕迹。我认为默认情况下,德比不会记录所有事情,我会改变这一点,看看会有什么结果!如果在启动应用程序后不久访问数据库会发生什么。我想说的是,自应用程序初始化以来,连接或语句可能在15分钟的不活动时间内变得陈旧。应用程序是单线程的。为了确保有足够的磁盘空间,就内存而言,我没有收到任何类似的消息(在某些情况下,我们会有30分钟的异常,然后在一两个小时内一切都会恢复正常)。我将尝试使用更多的堆/堆栈运行cvm。我将更新我的帖子以包含更多信息刚刚编辑了我的问题以添加您要求的信息。如果我发现任何有趣的东西,我会查看语句缓存并发布