在同步的过程中报出如下异常,请问这个问题该怎么排查呢,是表里面某个字段为null引起的?
pid:1 nid:1 exception:setl:com.alibaba.otter.node.etl.extract.exceptions.ExtractException: java.util.concurrent.ExecutionException: org.apache.commons.beanutils.ConversionException: Error converting from 'String' to 'BigDecimal' null Caused by: java.util.concurrent.ExecutionException: org.apache.commons.beanutils.ConversionException: Error converting from 'String' to 'BigDecimal' null at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor.extract(DatabaseExtractor.java:139) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor.extract(DatabaseExtractor.java:81) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$$FastClassByCGLIB$$f79e22c6.invoke() at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:618) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$$EnhancerByCGLIB$$de7bc45b.extract() at com.alibaba.otter.node.etl.extract.extractor.OtterExtractorFactory.extract(OtterExtractorFactory.java:50) at com.alibaba.otter.node.etl.extract.ExtractTask$1.run(ExtractTask.java:79) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: org.apache.commons.beanutils.ConversionException: Error converting from 'String' to 'BigDecimal' null at org.apache.commons.beanutils.converters.AbstractConverter.handleError(AbstractConverter.java:267) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:164) at org.apache.commons.beanutils.converters.ConverterFacade.convert(ConverterFacade.java:60) at org.apache.commons.beanutils.ConvertUtilsBean.convert(ConvertUtilsBean.java:470) at com.alibaba.otter.node.etl.common.db.utils.SqlUtils.stringToSqlValue(SqlUtils.java:149) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$DatabaseExtractWorker.buildTableData(DatabaseExtractor.java:539) at com.alibaba.otter.node.etl.extract.extractor.DatabaseExtractor$DatabaseExtractWorker.run(DatabaseExtractor.java:306) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) ... 5 more Caused by: java.lang.NumberFormatException at java.math.BigDecimal.(BigDecimal.java:494) at java.math.BigDecimal.(BigDecimal.java:383) at java.math.BigDecimal.(BigDecimal.java:806) at org.apache.commons.beanutils.converters.NumberConverter.toNumber(NumberConverter.java:448) at org.apache.commons.beanutils.converters.NumberConverter.convertToType(NumberConverter.java:268) at org.apache.commons.beanutils.converters.AbstractConverter.convert(AbstractConverter.java:156) ... 12 more
使用了自由门,我正在看源代码,定位到DatabaseExtractWorker.buildTableData方法的 data.columnValues[i] = SqlUtils.stringToSqlValue(keyColumn.getColumnValue(), tableColumn.getTypeCode(), tableColumn.isRequired(), false);
从报错上应该是数据库里面有一个类型为decimal的字段值为null在转BigDecimal的时侯失败了,数据库为mysql,但是因为表非常多,不容易查找。
我看到ConvertUtilsBean类的convert方法里面有 if (log.isDebugEnabled()) { log.debug("Convert string '" + value + "' to class '" + clazz.getName() + "'"); } 这个debug模式怎么开启呢?
目前otter采用的版本为4.2.13
经过查看代码发现当mysql数据类型为numeric或者decimal的时侯会转成java的BigDeicmal。 经过查找,只找到了两张表的联合主键里面某个字段为decimal类型,但是这两张表里面都没有数据……
原提问者GitHub用户 LWT1118
根据您提供的错误信息,看起来是在将字符串(String)转换为BigDecimal时出现了问题。具体来说,错误信息中的Error converting from 'String' to 'BigDecimal' null
表明在转换过程中遇到了一个空值(null)。
要排查这个问题,您可以考虑以下几个方面:
检查数据源:确认数据源中是否存在空值(null)的情况。如果数据源中的某个字段包含了空值,并且在同步过程中尝试将其转换为BigDecimal,就会出现这个错误。您可以检查数据源中的相关字段,确保它们没有空值。
检查数据类型匹配:确保在进行转换时,源数据的类型与目标类型匹配。如果源数据的类型不是字符串(String),或者目标类型不是BigDecimal,也可能导致转换错误。请检查源数据的类型和目标类型是否正确匹配。
检查转换逻辑:如果您在同步过程中使用了自定义的转换逻辑,例如使用转换函数或脚本进行数据转换,那么请检查转换逻辑是否正确处理了空值的情况。确保在转换过程中对空值进行了适当的处理,以避免出现转换错误。
检查数据同步工具配置:如果您使用了数据同步工具(如阿里云的数据传输服务DTS)进行数据同步,那么请检查工具的配置是否正确。确保配置了正确的数据类型映射和转换规则,以便在同步过程中正确处理数据类型转换。
如果问题仍然存在,建议提供更多关于您的环境和操作的详细信息,以便我能够提供更具体的帮助。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。