论坛首页 入门技术论坛

为了优化性能,请看看我这段代码应该如何抉择

浏览 6040 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-10-20  
OO
我些了一个静态工具类,用来把日期(java.util.Date)进行处理,把放入数据库“开始日期”字段的日期的时间改为00:00:00.000,把“结束日期”字段的日期的时间改为23:59:59.999,以确保对数据进行日期字段查询时精确无误(因为用new Date()建立的日期对象,时间是系统的时间,这样造成进行日期查询时可能会不准确)。

以下是代码段:

package com.ocs.common.util;

import java.util.Date;
import java.util.Calendar;

/**
 * 日期处理组件,用于处理日期中的时、分、秒、毫秒,使日期处于当日的最开始时刻或最后时刻
 * @author Johnny 2006-06-19
 *
 */
public class DateProcessor {
	
	private static final long MAX_MILLISECONDS = 3600*24*1000 - 1; // 每日的最大毫秒数
	
	private static Calendar _tempCal = Calendar.getInstance();  // 用于线程安全的方法,避免频繁创建对象
	
	/**
	 * 工具类,不能被实例化
	 *
	 */
	private DateProcessor() {
		
	}
	
	/**
	 * 获得日期对象的最开始时间,即当日的00:00:00.000,返回Date是一个新对象,不影响传入对象
	 * @param startDate
	 * @return
	 */
	public static Date dateStart(Date startDate) {
		if(startDate==null)
			return null;
		Calendar tempCal = Calendar.getInstance();
		tempCal.setTime(startDate);
		tempCal.set(Calendar.HOUR_OF_DAY,0);
		tempCal.set(Calendar.MINUTE,0);
		tempCal.set(Calendar.SECOND,0);
		tempCal.set(Calendar.MILLISECOND,0);
		return tempCal.getTime();
	}
	
	/**
	 * 获得日期对象的最后时间,即当日的23:59:59.999,返回Date是一个新对象,不影响传入对象
	 * @param endDate
	 * @return
	 */
	public static Date dateEnd(Date endDate) {
		if(endDate==null)
			return null;
		Date tempDate = dateStart(endDate);  // 首先清空当日的时、分、秒、毫秒
		tempDate.setTime(tempDate.getTime()+MAX_MILLISECONDS);
		return tempDate;
	}
	
	
	/**
	 * 获得日期对象的最开始时间,即当日的00:00:00.000,返回Date是一个新对象,不影响传入对象
	 * @param startDate
	 * @return
	 */
	public static synchronized Date dateStartSync(Date startDate) {
		if(startDate==null)
			return null;
		_tempCal.setTime(startDate);
		_tempCal.set(Calendar.HOUR_OF_DAY,0);
		_tempCal.set(Calendar.MINUTE,0);
		_tempCal.set(Calendar.SECOND,0);
		_tempCal.set(Calendar.MILLISECOND,0);
		return _tempCal.getTime();
	}
	
	/**
	 * 获得日期对象的最后时间,即当日的23:59:59.999,返回Date是一个新对象,不影响传入对象
	 * @param endDate
	 * @return
	 */
	public static synchronized Date dateEndSync(Date endDate) {
		if(endDate==null)
			return null;
		Date tempDate = dateStart(endDate);  // 首先清空当日的时、分、秒、毫秒
		tempDate.setTime(tempDate.getTime()+MAX_MILLISECONDS);
		return tempDate;
	}
	
	public static void main(String[] args) {
		Date d = new Date();
		System.out.println(DateProcessor.dateStart(d));
		System.out.println(DateProcessor.dateEnd(d));
		
	}

}



现在的场景是,我一次可能有数千条数据要经过处理持久到数据库,但如果使用dateStart、dateEnd方法时,将会产生数千个Calendar对象,所以我特意增加了两个相应的同步方法dateStartSync、dateEndSync,但这样做,程序要频繁为方法加上同步锁,可能达到的效果会得不偿失,请问是用第一种方法好还是第二钟方法好呢?请各位发表意见。
   发表时间:2006-10-20  
johnnylzb 写道

现在的场景是,我一次可能有数千条数据要经过处理持久到数据库,但如果使用dateStart、dateEnd方法时,将会产生数千个Calendar对象,所以我特意增加了两个相应的同步方法dateStartSync、dateEndSync,但这样做,程序要频繁为方法加上同步锁,可能达到的效果会得不偿失,请问是用第一种方法好还是第二钟方法好呢?请各位发表意见。


产生多个Calendar对象有什么问题么?这不是一个重量级的调用。
同步不好。
前个问题可以加CPU和内存以有效的提高性能,但你这样一同步,再好的机器提升也有限哪。
0 请登录后投票
   发表时间:2006-10-20  
同步所带来的性能耗损真的会比产生数千个临时对象的耗损还大吗?
0 请登录后投票
   发表时间:2006-10-20  
多余的操作。完全没必要。
重新进行分析和设计吧。就取系统时间很好,绝对不会有什么查询方面的问题。
0 请登录后投票
   发表时间:2006-10-20  
date放到成员变量里,加以volatile修饰,每次进入方法先初始化,不知可以不?
0 请登录后投票
   发表时间:2006-10-20  
写个简单的程序测试一下运行时间不难吧?
0 请登录后投票
   发表时间:2006-10-20  
性能的优化应该建立在测试的基础上
0 请登录后投票
   发表时间:2006-10-20  
together 写道
多余的操作。完全没必要。
重新进行分析和设计吧。就取系统时间很好,绝对不会有什么查询方面的问题。


个人认为有问题,如果放进数据库的时候不作处理,直接用Date,就会出现如下情况,举例:

start_date = 2006-10-20 12:10:10.547
end_date = 2006-12-20 12:10:10.876

然后如果我要查询2006-12-20日的数据,而用于查询的Date对象是2006-12-20 13:10:10.876,那么就无法查到2006-12-20的13:10:10.876之前时间的数据,这样就会造成不准确。

所以在放入数据库时候,要进行处理,使数据变成:

start_date = 2006-10-20 00:00:00.000
end_date = 2006-12-20 59:59:159.999
0 请登录后投票
   发表时间:2006-10-20  
请你详细描述你这样做的原因和目的。
我并不知道你这两个字段分别代表了什么含义。
无论是时间段查询,还是只按日期查询,都不需要你来这样设计。

总结一下:
为什么需要设计两个时间,它们的作用分别是什么。
你需要用什么方式来返回什么结果?

老实说,日期段的处理,我做过的系统中应用的很多。没有你这样用的。
0 请登录后投票
   发表时间:2006-10-20  
同意together的意见

为了达到你查询和统计的“方便性”,你更改了存储到数据库中的时间,就失去业务的含义了

为什么不想想处理你的date条件参数呢
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics