kettle:一个数据库错误发生在从资源库文件读取转换时
程序员文章站
2024-03-22 11:20:58
...
问题情况:
现场反应导入一个资源库脚本后,打开导入的转换再保存后,再次打开报错:一个数据库错误发生在从资源库文件读取转换时
先贴日志吧(手输的,将就了):
nullpointexception:
at org.pentaho.di.repository.kdr.delegates.KettleDatabaseRepositoryStepDelegate.loadStepAttributesMap(KettleDatabaseRepositoryStepDelegate.java:441)
先打开代码看看,发现是步骤属性读取为空。
private Map<String, Map<String, String>> loadStepAttributesMap( ObjectId stepId ) throws KettleException {
Map<String, Map<String, String>> attributesMap = new HashMap<String, Map<String, String>>();
List<Object[]> attributeRows = repository.connectionDelegate.getStepAttributesBuffer();
RowMetaInterface rowMeta = repository.connectionDelegate.getStepAttributesRowMeta();
for ( Object[] attributeRow : attributeRows ) {//此处是441行
String code = rowMeta.getString( attributeRow, KettleDatabaseRepository.FIELD_STEP_ATTRIBUTE_CODE, null );
if ( code != null && code.startsWith( STEP_ATTRIBUTE_PREFIX ) ) {
String value =
rowMeta.getString( attributeRow, KettleDatabaseRepository.FIELD_STEP_ATTRIBUTE_VALUE_STR, null );
if ( value != null ) {
code = code.substring( STEP_ATTRIBUTE_PREFIX.length() );
int tabIndex = code.indexOf( '\t' );
if ( tabIndex > 0 ) {
String groupName = code.substring( 0, tabIndex );
String key = code.substring( tabIndex + 1 );
Map<String, String> attributes = attributesMap.get( groupName );
if ( attributes == null ) {
attributes = new HashMap<String, String>();
attributesMap.put( groupName, attributes );
}
attributes.put( key, value );
}
}
}
}
return attributesMap;
}
}
怀疑是sql执行不成功,进一步怀疑导入的资源库脚本中表名和字段名大小写有问题。让现场把字段名和表名全部改成大写(可以通过navicat的数据传输功能,或者notepad++的正则表达式批量替换功能把小写标识符转换成大写)。
现场改完,发现打开一个已有的转换,再保存后再打开还是报错,然后我让他们新建个转换,打开看看报错不,现场反馈出现乱码,发现数据库编码有问题,于是修改mysql配置文件character_set_server=utf8,重启数据库,再次导入资源库,问题消失。
虽然这个bug,没什么技术含量,但是现场环境跟踪bug很困难,还是记下来,免得下次碰到忘掉。
上一篇: C语言--带头双向循环链表的基本操作实现