Tomcat 5.5和6.0中的数据损坏问题运行功能

Jav*_*011 2 java linux tomcat centos

我一直试图找出这个bug几天.我已将问题缩小到测试用例,如下所示.同样,这是导致错误发生的测试用例.该功能(此时)不是实用的功能,而只是试图找出错误.

服务器正在运行: - Tomcat 6 - OpenJDK 1.6.0_17 - CentOS 5.5

我有一个简单的类文件,其中包含以下方法静态方法和静态变量声明:

public static java.text.SimpleDateFormat displayDateSDF1 = new java.text.SimpleDateFormat("MM/dd/yyyy");

public static java.util.Date getSubDateMini(String inputDate)
{
    java.util.Date testObj = null;
    try
    {
        testObj = displayDateSDF1.parse("01/01/2000") ;
    }
    catch (Exception e)
    {
    }
    return testObj;
}
Run Code Online (Sandbox Code Playgroud)

在Tomcat中进行测试:

当我运行这个方法时,我希望每次都得到相同的结果,对吧?但是,如果我从JSP调用此方法,我会获得Date对象的预期结果,其值为1/1/2000,大约为99.9%.但是,有时我会使用看似随机的日期值传回一个意外的数据对象.

为了测试这个,我创建了一个JSP,其中包含以下代码段:

for (int i=0; i<200000;i++)
{
    java.util.Date testObjLib = TestDate.getSubDateMini("") ;
    if (testObjLib!=null&&!testObjLib.toString().equalsIgnoreCase("Sat Jan 01 00:00:00 PST 2000"))
    {
            out.print("<br>"+testObjLib+"");
    }
}
Run Code Online (Sandbox Code Playgroud)

出现的一些日期如下:

1月1日00:00:00太平洋标准时间1

星期五01月01日00:00:00 PDT 2166

在200,000次运行中,我得到大约50个错误日期,错误率为~0.025%,但同样是随机的.我用10次迭代运行这个循环并收到错误.有时它以200,000运行循环并且所有日期看起来都很好.

用Java测试:

通过CentOS中的控制台/终端应用程序使用相同的循环运行此循环,我还没有看到此错误发生.我将循环增加到10,000,000并且到目前为止还没有错误的结果.


我可以理解内存不足或一些抛出的错误(这将导致空值)但不会损坏/不一致的数据.我从头开始用Tomcat 6构建了一个新服务器,并尝试了Tomcat 5.5,两者都有相同的结果.我没有尝试过Tomcat 7.

有什么建议?

Boz*_*zho 5

SimpleDateFormat 不是线程安全的.

这意味着当从多个线程访问它时,可以观察到意外的结果.并且tomcat正在为来自单独线程的每个请求提供服务,因此每当两个请求同时发出时,就会出现问题.

你有很多选择:

  • 实例化方法的SimpleDateFormat每次调用(而不是制作它static)
  • 如果每个线程需要多次格式,请使用a ThreadLocal来存储它.
  • 或者使用joda-time,其中DateTimeFormat是线程安全的.