Hibernate在执行数个查询或插入操作后出现卡顿现象。

5
我正在使用Hibernate Relationship来开发Spring和Hibernate Web应用程序,在前三次工作中,它能够成功地从数据库中获取记录且没有问题,但在第四次尝试时,应用程序会卡住或冻结。当我重新启动Tomcat服务器后,一切都正常,但再次尝试第四次操作后会再次卡住或冻结。应用程序卡住或冻结时没有任何错误提示,这让我很困惑。当我测试另一个未使用Hibernate关系的类时,一切都正常。我怀疑是Hibernate关系引起的问题,但我不确定。
以下是我的Hibernate关系参考: mkyong viralpatel 这是我的ERD。

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;
}
}

这是我的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 ~

你能否添加如何指定dataSource bean的说明? - alobodzk
@alobodzk,我已经更新了我的问题,请查看一下~ - splatter_fadli
2个回答

2

0

我并不容易看出是什么导致了间歇性问题,但有一些地方需要纠正,也许更改会纠正这种行为。

一些要点:

  1. 我认为你应该将@Id列设置为LongInteger,并保持一致。

  2. 你的实现有一些令人困惑的结构。为什么需要同时使用get()getTanya()

  3. 在我的示例中,我注释的是字段,而不是getter方法。这似乎是Spring的偏好,尽管有不同的意见

  4. 从你提供的代码中,我无法确定是否包含了@Transactional。无论如何,你可以将那些readOnly的标记为只读。

  5. (顺带一提)如果你没有添加任何具体内容,就不需要指定默认值,例如FetchType.LAZY@Column。只包括最少量的代码,这样下一个人就更容易阅读。

除此之外,您还可以转储堆栈跟踪并查看线程挂起的位置。

通用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;
    }
}

答案:

@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;
    }

}

我已经删除了所有的关联,但当搜索输入时仍然面临同样的问题,真的没有任何想法 :DD~ - splatter_fadli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接