首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 企业软件 > 行业软件 >

常见Exception跟调bug的习惯

2012-07-25 
常见Exception和调bug的习惯1、开发排除异常的好习惯:debug模式:a、设置断点 b、F6运行 c、F5可进入对应方法查

常见Exception和调bug的习惯

1、开发排除异常的好习惯:

debug模式:a、设置断点 b、F6运行 c、F5可进入对应方法查看具体运行。

?

2、Exception:ORA-01401: inserted value too large for column

字段设置的长度不够,在oracle中可执行下列语句修改字段长度:

?oracle中:alter table t_dslam? modify (factoryedition varchar2(128));

sqlserver中:alter table t_dslam? alter factoryedition? varchar2(128);

?

?

3、ORA-00001: unique constraint (BBASS.PK98) violated?? 主键约束问题

?

BBASS.PK98为当前要插入数据的表中的一个主键名。

?

出现这个错误的原因:主键存在重复的问题,在bbass平台中(包括以后很多时候),很多model在自动生成主键的时候,会采用sequence的方式,并且很多时候hibernate的配置文件中会将不同的model的sequence名称配置为相同的名称。

在网上查看了一些资料:

发现不少说这是一个9i的BUG,10g中已经fixed。这是我查到的原文:

ORA-00001 PERFSTAT.STATS$SQL_SUMMARY_PK2009-03-13 19:23又遇到了ORA-00001 PERFSTAT.STATS$SQL_SUMMARY_PK ,记得当时好像disable一下就可以了,今天有空metalink上查了一下,原来是9i的bug,10g中fixed.

?Database Bug.2784796 - ORA-00001 UNIQUE CONSTRAINT (PERFSTAT.STATS$SQL_SUMMARY_PK) VIOLATED.

?解决方法:

1.ALTER TABLE PERFSTAT.STATS$SQL_SUMMARY MODIFY CONSTRAINT STATS$SQL_SUMMARY_PK DISABLE NOVALIDATE;

2.1. Please run the following sql statements: (Please be sure the view STATS$V_$SQLXS created successfully in the sys schema) sqlplus " / as sysdba"

SQL> spool run_statspack.txt

SQL> create or replace view STATS$V_$SQLXS as select max(sql_text) sql_text , sum(sharable_mem) sharable_mem , sum(sorts) sorts , min(module) module , sum(loaded_versions) loaded_versions , sum(fetches) fetches , sum(executions) executions , sum(loads) loads , sum(invalidations) invalidations , sum(parse_calls) parse_calls , sum(disk_reads) disk_reads , sum(buffer_gets) buffer_gets , sum(rows_processed) rows_processed , max(command_type) command_type , address address , hash_value hash_value , count(1) version_count , sum(cpu_time) cpu_time , sum(elapsed_time) elapsed_time , max(outline_sid) outline_sid , max(outline_category) outline_category , max(is_obsolete) is_obsolete , max(child_latch) child_latch from v$sql where ( plan_hash_value > 0 or executions > 0 or parse_calls > 0 or disk_reads > 0 or buffer_gets > 0) group by hash_value, address;

SQL> select owner,object_name from dba_objects where status ='INVALID';

SQL> @?/rdbms/admin/utlrp

SQL> select owner,object_name from dba_objects where status ='INVALID';

SQL> conn perfstat/perfstat_password

SQL> execute statspack.snap(i_snap_level=>5);

SQL> spool off;

?

?

?

?

?

?

?

?

但是针对主键重复的问题是:save数据时,无法插入新的数据,

我们的解决方法:重置sequence。在sqlplus中或者PS/SQL中手工重置一下sequence的值(前提是查出所有用同一sequence名称的表中最大的id)。

然后可以重置sequence中的start with的值,但是oracle是不允许直接这个语句(ALTER SEQUENCE SEQ_OTHERID start with 50000;)执行的。所以解决的方法是:

1、直接先drop再create,DROP SEQUENCE SEQ_OTHERID (SEQ_OTHERID 是sequence_name);

--SEQ_OTHERID 是sequence_name

SQL>DROP SEQUENCE SEQ_OTHERID;

?-- Create sequence

SQL>create sequence SEQ_OTHERID minvalue 1 maxvalue 999999999999999999999999999 start with 50000 increment by 1 cache 20;

?

?

?

?

?

?

?然后可以

SQL>select SEQ_OTHERID.nextval from dual;查看新的 start with的值,已经改变为50000了。?

注意:

在生产环境中:也就是说这些sequence正在被用到的时候,如果drop掉的话,就会出现错误。

?

所以可以采用下面的解决方法:

2、可以先修改increment by的值,这个是可以直接alter的

SQL>ALTER SEQUENCE SEQ_OTHERID INCREMENT BY 50000;

再执行下面的SQL语句

SQL>select SEQ_OTHERID.nextval from dual;

执行完后,start with的值就变为之前sequence中的start with+50000的值,

再将INCREMENT BY 修改回来

SQL>ALTER SEQUENCE SEQ_OTHERID INCREMENT BY 1;

?上述过程就相当于修改了start with的值。

?

再贴一个网上搜到的方法:

--create procedure pro_test for test

create or replace procedure pro_reset_seq(v_seqname varchar2) as n_temp number(10);

?s_tsql varchar2(100);

?begin execute immediate ' select ' || v_seqname || '.nextval from dual' into n_temp; if n_temp <> 1 then n_temp := -(n_temp-1); s_tsql := ' alter sequence ' || v_seqname || ' increment by ' || n_temp; execute immediate s_tsql; execute immediate ' select ' || v_seqname || '.nextval from dual' into n_temp; s_tsql := ' alter sequence ' || v_seqname || ' increment by 1 '; execute immediate s_tsql; end if; end;

/ 在SQL PLUS中调用 exec pro_reset_seq('seq_test');?

/ 你所希望重置的序列就可以重新从1开始递增了。

?

?

?

?

?

?

?

?

?

4、java.lang.reflect.InvocationTargetException

Caused by: java.lang.NoSuchMethodError: org.hibernate.hql.antlr.HqlBaseParser.recover(Lantlr/RecognitionException;Lantlr/collections/impl/BitSet;)V

这个Error一般就是HQL的语法问题,仔细检查报错的地方是否存在HQL的语法错误,例如:不支持子查询,不支持select count(count(*))等。或者是瓶装后的HQL存在语法问题。

?

?5、org.xml.sax.SAXParseException: Reference is not allowed in prolog 。当解析xml时,会出现该异常。

?

原因是因为xml文件格式不正确,检查xml文件是否有不合法字符。

?

6、org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence。解析xml,出现该异常。

?

?

?

SAXBuilder builder = new SAXBuilder(); Document doc = builder.build(new File(responseXmlPath)); Element foo = doc.getRootElement();

?

?

?

?

在生成Document 对象时,Eclipse编译文件的编码或者文件所在地的编码和该文件需要的编码不一致,会产生该异常。 解决办法:在生成该文件或者向文件中写入文件时,指定为所需编码。如:?

?

BufferedWriter bw = null; try { bw = new BufferedWriter(new OutputStreamWriter( new FileOutputStream(new File(responseXmlPath)), "UTF-8")); bw.write(resultStr); bw.flush(); } catch (UnsupportedEncodingException e) { logger.error("when create OutputStreamWriter, encoding error", e); } catch (IOException e) { logger.error("when write resultStr to responseXml error:", e); } finally { if (bw != null) try { bw.close(); } catch (IOException e) { logger.error( "when finally close the BufferedWriter error:", e); } }

?

?

?

?

?

最好在获取Documen的时候,也用指定编码的IO获取。

Document doc = builder.build(new InputStreamReader( new FileInputStream(new File(responseXmlPath)), "UTF-8"));

但是生成文件时,必须指定为所需编码。

?

7、java.lang.IncompatibleClassChangeError: Found class org.snmp4j.smi.Variable, but interface was expected

?

?? 今天在调试公司以前的一套SNMP采集的代码,由于之前的采集代码被打成包并且做了混淆,最郁闷的是连SNMP4J的jar包也做了混淆,而且无论是现网lib包中还是本地的lib中的SNMP4J的jar包都没有版本号,所以报上面的这个错。

?? 郁闷了一下午,今早上班自己读了下这个Exception,发现英语是多么的重要,其实他的意思是:不相容的的类,找到了一个Variable类,但是我们代码中预期的是要一个Variable的接口,所以应该是当前的SNMP4J的jar包中Variable是一个类而并非一个接口,打开SNMP的API查看了下,发现Variable是一个接口的版本从1.8版本开始。所以新找了个SNMP4J的jar包,重新测试,解决了问题。

?

?

?

?

?

?

 

热点排行