Hibernate在几个选择查询或插入查询后挂起

时间:2016-08-09 12:39:32

标签: java mysql spring hibernate

我正在使用Hibernate Relationship处理spring和hibernate web应用程序,并且它没有问题3次工作并且从数据库中获取记录没有问题,但是应用程序挂起或冻结的时间是4倍重新启动tomcat服务器一切都很好,挂起或再次冻结4次尝试。当应用程序挂起或冻结使我如此困惑时没有错误。当我测试另一个不使用Hibernate关系的类运行良好时,我怀疑是关系,但我不知道〜

这是我的Hibernate Relationship参考〜

mkyong

viralpatel

这是我的错误,

enter image description here

这是我的用户类

@SuppressWarnings("serial")
@Entity
@Table(name="user")
public class User implements Serializable{

private String no_dana;
private String npp;

@Id
@Column(name="no_dana", unique=true, nullable=false, updatable=false)
public String getNo_dana() {
    return no_dana;
}
public void setNo_dana(String no_dana) {
    this.no_dana = no_dana;
}
@Column(name="npp")
public String getNpp() {
    return npp;
}
private Set<Tanya> tanya;

@OneToMany(fetch= FetchType.LAZY, cascade=CascadeType.ALL, mappedBy="user")
public Set<Tanya> getTanya() {
    return tanya;
}
public void setTanya(Set<Tanya> tanya) {
    this.tanya = tanya;
}

private Set<Jawab> jawab;

@OneToMany(fetch = FetchType.LAZY, mappedBy="user")
public Set<Jawab> getJawab() {
    return jawab;
}
public void setJawab(Set<Jawab> jawab) {
    this.jawab = jawab;
}
}

这是我的tanya课程,

@SuppressWarnings("serial")
@Entity
@Table(name="tanya")
public class Tanya implements Serializable{

private int id_tanya;
private String isi;

@Id
@Column(name="id_tanya", unique=true, nullable=false)
public int getId_tanya() {
    return id_tanya;
}
public void setId_tanya(int id_tanya) {
    this.id_tanya = id_tanya;
}
@Column(name="isi")
public String getIsi() {
    return isi;
}
public void setIsi(String isi) {
    this.isi = isi;
}
private User user;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="no_dana")
public User getUser() {
    return user;
}
public void setUser(User user) {
    this.user = user;
}

private Set<Jawab> jawab;

@OneToMany(fetch = FetchType.LAZY, mappedBy="tanya")
public Set<Jawab> getJawab() {
    return jawab;
}
public void setJawab(Set<Jawab> jawab) {
    this.jawab = jawab;
}
}

这是我的下课,

@SuppressWarnings("serial")
@Entity
@Table(name="jawab")
public class Jawab implements Serializable{

private int id_jawab;
private String isi;

@Id
@Column(name="id_jawab", unique=true, nullable=false)
public int getId_jawab() {
    return id_jawab;
}
public void setId_jawab(int id_jawab) {
    this.id_jawab = id_jawab;
}
@Column(name="isi")
public String getIsi() {
    return isi;
}
public void setIsi(String isi) {
    this.isi = isi;
}

private User user;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="no_dana")
public User getUser() {
    return user;
}
public void setUser(User user) {
    this.user = user;
}

private Tanya tanya;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="id_tanya")
public Tanya getTanya() {
    return tanya;
}
public void setTanya(Tanya tanya) {
    this.tanya = tanya;
}
}

这是我的dao样本(来自tanya类),

@Autowired
private TanyaDaoImpl(SessionFactory sessionFactory){
    setSessionFactory(sessionFactory);
}

@SuppressWarnings("unchecked")
@Override
public Tanya get(int id_tanya)throws Exception{
    DetachedCriteria criteria = DetachedCriteria.forClass(Tanya.class).add(Restrictions.eq("id_tanya", id_tanya));
    List<Tanya> tanyaList = getHibernateTemplate().findByCriteria(criteria);
    return tanyaList.get(0);
}

@Override
public Tanya getTanya(int id_tanya)throws Exception{
    Query query = getSession().createQuery("from Tanya where id_tanya = :id_tanya");
    query.setParameter("id_tanya", id_tanya);
    return (Tanya) query.list().get(0);
}

@Override
public void save(Tanya tanya)throws Exception{
    getHibernateTemplate().save(tanya);
}

@Override
public void update(Tanya tanya)throws Exception{
    getHibernateTemplate().update(tanya);
}

@Override
public void delete(Tanya tanya)throws Exception{
    getHibernateTemplate().delete(tanya);
}

@SuppressWarnings("unchecked")
@Override
public List<Tanya> listAllTanya()throws Exception{
    DetachedCriteria criteria = DetachedCriteria.forClass(Tanya.class);
    List<Tanya> tanyaList = getHibernateTemplate().findByCriteria(criteria);
    return tanyaList;
}

这是我的会话配置,

<context:component-scan base-package="org.ppbni.splatter" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/db_ppbni" />
    <property name="username" value="root" />
    <property name="password" value="shikamaru" />

    <!-- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/ppbniorg_db" />
    <property name="username" value="ppbniorg_user" />
    <property name="password" value="shikamaru" /> -->

</bean>
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="configurationClass" value="org.hibernate.cfg.AnnotationConfiguration"></property>
    <property name="dataSource" ref="dataSource"></property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
    <property name="packagesToScan" value="org.ppbni.splatter.model" />
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"
    p:sessionFactory-ref="sessionFactory">
</bean>

任何帮助都会很愉快:D~

2 个答案:

答案 0 :(得分:1)

这可能是因为之前的会话。在成功的事务之后,使用session.close()方法关闭会话,这将释放连接到数据库的实例。由于这种方法,问题得到纠正。

session.close();

https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#close()

答案 1 :(得分:0)

我不会轻易看到导致间歇性问题的原因,但有一些事情可能会使用纠正,也许这些变化会纠正行为。

有些观点:

  1. 我的感觉是你应该制作@Id专栏 LongInteger并保持一致。

  2. 你的impl有一些令人困惑的结构。为什么你需要get()getTanya()

  3. 在下面的示例中,我注释的是字段,而不是getter。这似乎是Spring的偏好,尽管有varying opinions

  4. 根据您提供的代码,我无法判断您是否包含@Transactional。无论如何,您可以标记readOnly个。

  5. (旁白)如果您没有添加任何细节,则不需要指定FetchType.LAZY@Column等默认值。仅包含最低限度的代码,以便下一个人更容易阅读。

  6. 除此之外,您还可以dump a stack trace查看帖子的悬挂位置。

    通用CRUD界面:

    public interface GenericDao<T> {
    
        T find(Long id);
    
        List<T> findAll();
    
        T update(T t);
    
        T save(T t);
    
        void delete(Long id);
    }
    

    TanyaDAO:

    public interface TanyaDao extends GenericDao<Tanya> {
    
        //add any specific Tanya code
    }
    

    TanyaDAOImpl:

    @Repository
    @Transactional
    public class TanyaDaoImpl implements TanyaDao {
    
        @Override
        @Transactional(readOnly = true, timeout = 10)
        public Tanya find(Integer id) {
            return (Tanya) getCurrentSession().get(Tanya.class, id);
        }
    
        @Override
        @Transactional(readOnly = true, timeout = 10)
        public List<Tanya> findAll() {
            Criteria criteria = getCurrentSession().createCriteria(Tanya.class); // this may be different depending on your version of Hibernate
            @SuppressWarnings("unchecked")
            List<Tanya> tanyas = criteria.list();
            return tanyas;
        }
    
        @Override
        public Tanya update(Tanya tanya) {
            try {
                getCurrentSession().update(tanya);
            }
            catch (NonUniqueObjectException ignored) {
                tanya = (Tanya) getCurrentSession().merge(tanya); //you may or may not need to do this part
            }
            return tanya;
        }
    
        @Override
        public Tanya save(Tanya tanya) {
            Serializable id = getCurrentSession().save(tanya);
            return (Tanya) getCurrentSession().get(Tanya.class, id);
        }
    
        @Override
        public void delete(Integer id) {
            Tanya tanya = find(id.intValue());
            getCurrentSession().delete(tanya);
        }
    
        @Autowired
        private SessionFactory sessionFactory;
    
        private Session getCurrentSession() {
            return sessionFactory.getCurrentSession();
        }
    }
    

    用户:

    @Entity
    @Table(name = "user")
    public class User implements Serializable {
    
        @Id
        @Column(name = "no_dana")
        @GeneratedValue
        private Long id;
    
        @OneToMany(cascade = CascadeType.ALL, mappedBy = "user")
        private Set<Tanya> tanya;
    
        @OneToMany(mappedBy = "user")
        private Set<Jawab> jawab;
    
        public Long getId() {
    
            return id;
        }
    
        public void setId(Long id) {
    
            this.id = id;
        }
    
        public Set<Tanya> getTanya() {
    
            return tanya;
        }
    
        public void setTanya(Set<Tanya> tanya) {
    
            this.tanya = tanya;
        }
    
        public Set<Jawab> getJawab() {
    
            return jawab;
        }
    
        public void setJawab(Set<Jawab> jawab) {
    
            this.jawab = jawab;
        }
    }
    

    Jawab:

    @Entity
    @Table(name = "jawab")
    public class Jawab implements Serializable {
    
        @Id
        @GeneratedValue
        @Column(name = "id_jawab")
        private Long id;
    
        private String isi;
    
        @ManyToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "no_dana")
        private User user;
    
        @ManyToOne
        @JoinColumn(name = "id_tanya")
        private Tanya tanya;
    
        public Long getId() {
    
            return id;
        }
    
        public void setId(Long id) {
    
            this.id = id;
        }
    
        public String getIsi() {
    
            return isi;
        }
    
        public void setIsi(String isi) {
    
            this.isi = isi;
        }
    
        public User getUser() {
    
            return user;
        }
    
        public void setUser(User user) {
    
            this.user = user;
        }
    
        public Tanya getTanya() {
    
            return tanya;
        }
    
        public void setTanya(Tanya tanya) {
    
            this.tanya = tanya;
        }
    
    }
    

    田雅:

    @Entity
    @Table(name = "tanya")
    public class Tanya implements Serializable {
    
        @Id
        @GeneratedValue
        @Column(name = "id_tanya")
        private Long id;
    
        private String isi;
    
        @ManyToOne(cascade = CascadeType.ALL)
        @JoinColumn(name = "no_dana")
        private User user;
    
        @OneToMany(mappedBy = "tanya")
        private Set<Jawab> jawab;
    
        public Long getId() {
    
            return id;
        }
    
        public void setId(Long id) {
    
            this.id = id;
        }
    
        public String getIsi() {
    
            return isi;
        }
    
        public void setIsi(String isi) {
    
            this.isi = isi;
        }
    
        public User getUser() {
    
            return user;
        }
    
        public void setUser(User user) {
    
            this.user = user;
        }
    
        public Set<Jawab> getJawab() {
    
            return jawab;
        }
    
        public void setJawab(Set<Jawab> jawab) {
    
            this.jawab = jawab;
        }
    
    }