代码之家  ›  专栏  ›  技术社区  ›  Dani Cricco

使用Spring、DBCP和Postgres的并发问题

  •  0
  • Dani Cricco  · 技术社区  · 14 年前

    我使用的软件堆栈是:tomcat->spring->hibernate->dbcp->postgresql

    我有一个查询,它使用类型为“timestamp without time zone”的列搜索一些数据。

    如果在单用户模式下测试应用程序,则没有问题。

    我在用 JMeter 做一些压力测试,可以看到有时查询失败。只有当多个用户同时访问应用程序时(同一秒内超过20个),才能复制此文件。

    错误如下:

    org.postgresql.util.psqlException:错误:时间戳超出范围:“20120100-09-26 00:00:00.000000-04:00:00”

    Org.PostgreSQL .Corr.V3.QueRealExtuororIMP.Access VelorReRebug(QueRealExtudiorIMPL.java:2062) Org.PostgreSQL .Corr.V3.QueRealExtuororIMP.Purror结果(QueRealExtudiorIMPL.java:1795) Org.PostgreSQL .Corr.V3.QueRealEuthorIMP.Excel(QueRealExtuutorIMP.java:257) Orac.PostgreSQL .jdc2. 2.cjdcc2Salp.Exc执行(抽象JDbc2Salp.java:479) Org.PostgreSQL .jdc2. 2. Orac.PostgreSQL .jdc2. 2. Org.Apache .Corns.DCP.DealTePrimeRealDealSale.ExcExtQueQue:(委派PrimeReaDealStay.java:96) Org.Apache .Corns.DCP.DealTePrimeRealDealSale.ExcExtQueQue:(委派PrimeReaDealStay.java:96) Org.Hibernate .jDBC.ActudioButel.GETReultTSET(AbxasButel.java:208) org .Hibernate .Looul.Looul.GETReultTSET(Loist.java:1808) Org.Hibernate .Looul.Load .doQuoice(Looper-Java:697) Org.Hibernate .Looul.Looul.DoQuyReDealAlgEnZeNeNon LaZyTy集合(Looal.java:259) Org.Hibernate .Looul.Load .DOLIST(Looal.java:2228) org .Hibernate .Looul.Load .ListIGNORQualEclipse(Looal.java:2125) org .Hibernate .Looul.Load .List.(加载程序. Java:2120) Org.Hibernate .Looul.HQL.QueIdLogial.List.(QuyLoistor.java:401) Org.Hibernate .HQL.AST.QuielTrasororIMP.List.(QueIsTrasororIMP.java:361) Org.Hibernate .Engul.Queq.HQLQuyRealPay.PorForm列表(HQLQueRealPay.java:196) Org.Hibernate .IMP.SalestIMP.LIST(SeaSimult.java:1148) Org.Hibernate .IMP.QuielIMP.List.(QuijIMP.java:102) Org.Hibernate .Ejb.QuijIMP.GETReultList.(QuyIMP.java:67)

    我使用的版本是:

    • Tomcat 6.0.26型
    • 弹簧3
    • DBCP 1.4
    • PostgreSQL-8.4-701.jdbc4.jar版本
    • PostgreSQL版本:8.4.4-0ubuntu10.04
    2 回复  |  直到 14 年前
        1
  •  2
  •   Jon Freedman    14 年前

    在Java代码中,您是否在任何地方使用了DeaFrice对象的非线程安全使用?奇怪而美妙的约会错误常常源于这种问题?

    private static final DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    

    变成

    private static final ThreadLocal<DateFormat> fmt = new ThreadLocal<DateFormat>() {
        @Override
        protected DateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        }
    }
    

    DateFormat , ThreadLocal

        2
  •  1
  •   Frank Heikens    14 年前

    时间戳超出范围: “20120100-09-26 00:00:00.000000 -04:00:00英寸

    你在20120100年工作?(两千万)你确定吗?时间戳的最大年份是294276,但我敢肯定您的输入是不正确的。

    这也与并发性无关,只是超出了输入范围。