124.Spark大型电商项目-Spark Streaming+Kafka调试之java.lang.NumberFormatException: multiple points

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/someby/article/details/90142101

目录

 

解决问题:java.lang.NumberFormatException: multiple points

出现问题的代码

出现问题的原因

解决方法

为每个线程创建独立的格式实例

共用一个格式,但是外部代码进行同步


解决问题:java.lang.NumberFormatException: multiple points

在实时广告流统计模块测试的时候,使用的是数据库连接池的方式,需要不断的操作数据库,但是当程序运行一会时就会出现上述的错误,接下来这篇文章将介绍如何解决这个问题。

出现问题的代码

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * FileName: DateUtils
 * Author:   hadoop
 * Email:    [email protected]
 * Date:     19-2-25 下午7:09
 * Description:日期时间工具类
 */
public class DateUtils {
    public static final SimpleDateFormat DATEKEY_FORMAT = new SimpleDateFormat("yyyyMMdd");

    /**
     * 格式化日期key
     * @param dateKey
     * @return
     */
   public static Date parseDateKey(String dateKey){

       try{
           return DATEKEY_FORMAT.parse(dateKey);
       }catch(ParseException e){
           e.printStackTrace();
       }


       return null;
   }


}

出现问题的原因

日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。

意思是说,SimpleDateFormat在多线程环境下,是线程不安全的,如果在多线程环境中共享了SimpleDateFormat的实例,比如在类似日期类中定义了一个全局的SimpleDateFormat对象,这样子肯定会出现上述的报错。

当然,根据官方文档,也给我们了两个解决这个问题方法。

解决方法

1.为每个线程创建独立的格式实例。

2.多个线程同时访问一个格式,则它必须是外部同步的

现在,就这个两个解决问题的思路。分别实现代码如下:

为每个线程创建独立的格式实例

//为每个线程创建独立的格式实例

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * FileName: DateUtils
 * Author:   hadoop
 * Email:    [email protected]
 * Date:     19-2-25 下午7:09
 * Description:日期时间工具类
 */
public class DateUtils {

    /**
     * 格式化日期key
     * @param dateKey
     * @return
     */
   public  static Date parseDateKey(String dateKey){

       try{
           SimpleDateFormat DATEKEY_FORMAT = new SimpleDateFormat("yyyyMMdd");
           return DATEKEY_FORMAT.parse(dateKey);
       }catch(ParseException e){
           e.printStackTrace();
       }


       return null;
   }


}

共用一个格式,但是外部代码进行同步

//共用一个格式,但是外部代码进行同步

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * FileName: DateUtils
 * Author:   hadoop
 * Email:    [email protected]
 * Date:     19-2-25 下午7:09
 * Description:日期时间工具类
 */
public class DateUtils {
    public static final SimpleDateFormat DATEKEY_FORMAT = new SimpleDateFormat("yyyyMMdd");

    /**
     * 格式化日期key
     * @param dateKey
     * @return
     */
   public synchronized static Date parseDateKey(String dateKey){

       try{
           return DATEKEY_FORMAT.parse(dateKey);
       }catch(ParseException e){
           e.printStackTrace();
       }


       return null;
   }


}

但是,在自己的项目中选用哪一个方法比较好,还需要和自己的需求结合起来进行选择。在本项目中,由于涉及到多线程的创建与维护,如果是数据库链接太多,并且是链接时间很长,同步可能是更好的选择。

猜你喜欢

转载自blog.csdn.net/someby/article/details/90142101
今日推荐