SimpleDateFormat的线程安全问题——>报java.lang.NumberFormatException: multiple points或 For input string:

本文探讨了SimpleDateFormat在多线程环境下的线程安全问题,并提供了四种解决方案:使用局部变量、同步、ThreadLocal及第三方库如Apache Commons和Joda-Time。详细介绍了每种方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇定时多线程补全任务后续处理报了标题中的异常,发现是日期转换的问题,最后定位到SimpleDateFormat是线程不安全的

 

解决方案:

1、使用局部变量,每次处理时new SimpleDateFormat()

2、使用同步,不推荐,对性能有影响

3、使用ThreadLocal

public class DateUtil {
 
   private final static ThreadLocal<simpledateformat> tl = new ThreadLocal<simpledateformat>() {
      @Override
      protected SimpleDateFormat initialValue() {
           return new SimpleDateFormat("dd/MM/yyyy");
  }
 };
    public static Date parse(String dateStr) throws ParseException {
        return threadLocal.get().parse(dateStr);
    }

    public static String format(Date date) {
        return threadLocal.get().format(date);
    }
}

4、使用第三方的日期处理函数:

4.1、使用Apache commons 里的FastDateFormat,宣称是既快又线程安全的SimpleDateFormat, 不过它只能对日期进行format, 不能对日期串进行解析。

4.2、使用Joda-Time类库来处理时间相关问题

### DataX 中 `java.lang.NumberFormatException: multiple points` 错误解决方案 #### 问题分析 在DataX运行过程中,遇到了`java.lang.NumberFormatException: multiple points`错误。此异常通常发生在尝试解析不符合预期格式的浮点数日期间字符串[^1]。 具体来说,在处理数据转换的过程中,某些字段可能包含了多个小数点其他非法字符,这使得Java无法将其正确解析为所需的数值类型。此外,该异常还可能由日期间格式不匹配引起,特别是在使用`SimpleDateFormat`进行解析[^4]。 #### 解决方法 ##### 方法一:验证并清理输入数据 确保源端的数据质量良好,特别是对于涉及数字和日期类型的列。可以通过预处理脚本去除多余的空格、特殊字符以及额外的小数点等[^3]。 ```sql SELECT REPLACE(column_name, '.', '') AS cleaned_column FROM table_name; ``` ##### 方法二:调整目标表结构定义 如果确认上游系统的输出确实存在多处小数点的情况,则可以在设计下游数据库表结构适当放宽约束条件,比如采用VARCHAR代替DECIMAL存储这类易出现问题的数据项[^5]。 ##### 方法三:修改配置文件中的日期格式设置 当异常堆栈中提到`SimpleDateFormat`,表明可能是由于日期格式化模式与实际传入值不符所造成的。因此建议检查DataX作业配置JSON里的dateformat参数,并根据实际情况做出相应调整。 例如: ```json { "job": { ... "setting": { "speed": {}, "errorLimit": {} }, "content": [ { "reader": {...}, "writer": { "name": "...", "parameter": { ... "column":[ {"type":"string","index":0,"dateFormat":"yyyy-MM-dd HH:mm:ss"} ] } } } ] } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值