`
kingquake21
  • 浏览: 267875 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程下Hibernate出现死循环

 
阅读更多

HashMap在多线程下导致死循环的原因可以参考http://mailinator.blogspot.com/2009/06/beautiful-race-condition.html

在多线程环境下,各个线程的Hibernate Session不同,使用Hibernate查询一个实体时,非常罕见的出现了一次,堆栈如下

"pool-130-thread-6" prio=10 tid=0x00002aab010ed800 nid=0x3aba runnable [0x000000004addf000]
   java.lang.Thread.State: RUNNABLE
        at java.util.HashMap.put(HashMap.java:391)
        at org.hibernate.engine.StatefulPersistenceContext.addCollection(StatefulPersistenceContext.java:764)
        at org.hibernate.engine.StatefulPersistenceContext.addUninitializedCollection(StatefulPersistenceContext.java:733)
        at org.hibernate.type.CollectionType.getCollection(CollectionType.java:609)
        at org.hibernate.type.CollectionType.resolveKey(CollectionType.java:408)
        at org.hibernate.type.CollectionType.resolve(CollectionType.java:402)
        at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:120)
        at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:854)
        at org.hibernate.loader.Loader.doQuery(Loader.java:729)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
        at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
        at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3049)
        at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:399)
        at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
        at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
        at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:98)
        at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
        at org.hibernate.impl.SessionImpl.immediateLoad(SessionImpl.java:836)
        at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:66)
        at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111)
        at org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150

   

 跟踪调试,发现在多个线程中确实存在相同的session,这些session存在于持久化实体中的CGLIB代理里面

由于这些实体对象是在进入多线程环境之前就已经查询出来了,但是他们关联的对象都是lazy-load,所以都以CGLIB的形式存在与这些实体对象中。于是,在多线程环境下,尽管重新生成了新的session,但是通过实体延迟加载时就会使用之前的session,这样就导致了一个错误的用法:并发使用Hibernate的session

 

分享到:
评论
1 楼 a14400610 2014-12-29  
我现在也碰到这个问题 请问有什么解决方法吗

相关推荐

    java面试题综合

    40. String与StringBuffer:String是不可变的,StringBuffer在多线程环境中更安全。 41. Overload与Override:Overload是方法重载,可以改变返回类型;Override只能重写已有的方法,不能改变返回类型。 42. ...

    java日常总结(面试 技术总结 SCJP考试)

    6. **多线程**:Java内置了对多线程的支持,通过实现Runnable接口或继承Thread类创建线程。线程同步机制包括synchronized关键字、wait()、notify()和notifyAll()方法。 7. **IO流**:Java的IO流分为字节流和字符流...

    200篇阿里面经.pdf

    - **线程模型**:Java虚拟机如何实现多线程。 #### 2.2 垃圾收集 - **GC算法**:标记-清除、复制算法、标记-整理、分代收集等。 - **垃圾收集器**:Serial、ParNew、Parallel Scavenge、CMS、G1等收集器的特点及其...

    Java后端技术面试汇总-2019

    - **多线程情况下HashMap死循环的问题**:当多个线程同时进行put操作时可能导致循环链表形成闭环。 - **HashMap出现HashDOS攻击的问题**:恶意构造大量相同的哈希值导致性能下降。 - **ConcurrentHashMap的工作...

    74个java面试题,只有题目没有答案

    Java 语言具有平台独立性、对象oriented、分布式、多线程、动态加载等特点。 1. Java 基础知识 * 什么是 Java?Java 是一种高级编程语言,具有平台独立性、对象oriented、分布式、多线程、动态加载等特点。 * 为...

    文思创新试题. 杭州公司

    - 数据一致性问题:多线程环境下需要处理好同步问题,避免数据不一致。 ### 9. 为什么需要使用线程池? 使用线程池可以有效地管理线程资源,减少创建和销毁线程的开销,同时控制并发线程的数量,防止过多线程导致...

    开发自己的搜索引擎——Lucene+Heritrix(第2版)_含书(PDF)和光盘

    6. 扩展性:Lucene可以与其他系统集成,如Spring、Hibernate等,支持分布式搜索和多线程处理。 Heritrix则是一个网络爬虫工具,用于抓取互联网上的网页以便进行进一步的分析和索引。Heritrix提供了强大的配置能力,...

    45家公司的java面试题目,欢迎下载

    6. **多线程**: - 线程状态:了解新建、就绪、运行、阻塞和死亡五种状态。 - synchronized关键字:理解其用法和同步的作用。 - volatile关键字:知道它如何确保内存可见性。 - Lock接口:对比synchronized与...

    Java20230329整理面试题.pdf

    五、多线程 1. 线程的创建:Thread类、Runnable接口。 2. 线程同步:synchronized关键字,wait()、notify()、notifyAll()方法。 3. 线程状态:新建、运行、阻塞、等待、死亡等。 4. 线程池:ExecutorService、...

    java 反模式 卷4 pdf

    4. **循环引用**:对象之间形成循环引用,可能导致内存泄漏。理解并正确使用弱引用和软引用可以避免此类问题。 5. **忽视异常处理**:不恰当的异常处理可能导致程序在遇到错误时崩溃,而不是优雅地处理问题。应该...

    java八股文.docx

    - **多线程与并发**:理解Thread类与Runnable接口的差异,熟悉synchronized关键字的用法,掌握并发编程的基础知识。 #### 4. Java虚拟机(JVM) - **内存模型**:了解JVM的内存布局,包括堆、栈、方法区等部分的...

Global site tag (gtag.js) - Google Analytics