Hibernate Connection Pool Validation Thread java.lang.OutOfMemoryError

Hibernate Connection Pool Validation Thread java.lang.OutOfMemoryError,第1张

近日,用Springboot做了一个网络服务器,原理很简单,网络访问以后,用数据库存储访问。

代码如下:

@RestController
@RequestMapping("/test")
public class ThirdParkController {
    private EntityManagerFactory mFactory = null;
    private EntityManager mEm = null;

    // 
    /// 车辆入场接口
    /// 
    /// 空
    /// 
    @Transactional(rollbackFor = Exception.class)
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public String test(@RequestBody Data data) {
        String result = null;

        if (data == null) {;
            return null;
        }


        try {
            mFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);

            mEm = mFactory.createEntityManager();
            mEm.getTransaction().begin();
			
			//相关 *** 作
			//一系列存储 *** 作
            mEm.getTransaction().commit();
            mEm.clear();
            mEm.close();
            mFactory = null;
			result = "服务成功!";
		} catch (Exception e) {
            mEm.getTransaction().rollback();
            mEm.clear();
            mEm.close();
            mFactory = null;
            mEm = null;
            result = "服务异常,请稍后重试!";

            mLogger.error("Api/ThirdPark/EnterVenue 异常信息=%s 内部异常信息=%s 数据=%s",
                e.getMessage(),
                e.getStackTrace(),
                mGson.toJson(data)
            );

            e.printStackTrace();
        }
		
		retrun result;
	}
}

然后,调用极限测试,竟然发现有“java.lang.OutOfMemoryError: GC overhead limit exceeded”错误。

GC overhead limit,显然是垃圾处理机制出问题了。相关解决方案一般为:加大堆内存。于是,加大堆内存。

发现该方案最终只是让该问题出现的时间变长了,但并未解决问题。

认真看了下,该问题为:

“Exception in thread "Hibernate Connection Pool Validation Thread" Exception in thread "Hibernate Connection Pool Validation Thread" java.lang.OutOfMemoryError: GC overhead limit exceeded”

发现该问题,网上并无太好解决方案。

认真研究了下,发现该问题的实质原因和解决方案如下:

1)该问题实质是多次创建线程池,造成线程池崩溃了;

2)线程池显然并不需要多次创建,保持常态的线程池即可;

3)创建线程池的语句为Persistence.createEntityManagerFactory,让该语句少运行即可;

4)如果线程池和EntityManagerFactory是唯一的,创建一次即可;如果是多样的,保持同种类型创建创建一次即可;

5)笔者这里,EntityManagerFactory(Hibernate工厂)需要多个,笔者创建了一个单例创建和存储该工厂,保证同种类型的Hibernate工厂只有一个。

该问题,完美解决。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/892010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-14
下一篇 2022-05-14

发表评论

登录后才能评论

评论列表(0条)

保存