首先,我不知道這是否是解釋我的問題的最佳標題,但是我們在這裏:我有一個名爲Product
的類,它具有@OneToOne
映射ProductPriceHistory
。即使在提交併關閉之後,交易仍然會打開
@Entity(name = "product")
public class Product {
@Id
@SequenceGenerator(name="seq_product", sequenceName="seq_product", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="seq_product")
private long id;
@Column(name="description", length=150)
private String description;
@OneToOne
private ProductPriceHistory price;
(...)
public double getPrice() {
double price = 0.0;
ProductPriceHistoryDaoImpl productPriceHistoryDaoImpl = new ProductPriceHistoryDaoImpl();
try {
productPriceHistoryDaoImpl.beginTx();
price = productPriceHistoryDaoImpl.getCurrentPriceByProductId(this.id);
productPriceHistoryDaoImpl.commitTx();
} catch(Exception e) {
(...)
}
return price;
}
}
正如你可以在我的getPrice()
方法看,我調用另一個Dao
檢索當前價格的產品。這可以工作幾次,但調用它像10倍後,它看起來像交易仍然是開放的,因爲我得到這個異常(我想它是特定的從PostgreSQL):ERROR: FATAL: remaining connection slots are reserved for non-replication superuser connections
。
我試過這種方法:實例ProductPriceHistoryDaoImpl productPriceHistoryDaoImpl
,打開事務和關閉它之外的調用getPrice()
,只是它傳遞的參數來調用查詢,這完美的作品(槽沒有過載如一日的代碼方法),但我不喜歡這種方法,因爲我在.jsp
頁面內使用getPrice()
,在這種情況下我不能通過參數ProductPriceHistoryDaoImpl
。
添加一點點的代碼只是爲了更清晰
public class ProductPriceHistoryDaoImpl extends DefaultDaoImpl<ProductPriceHistory>{
private EntityManager em = HibernateManager.getEntityManager();
public ProductPriceHistory() {
super(ProductPriceHistory.class);
}
public double getCurrentPriceByProductId(long productId) {
(...)
}
}
DefaultDaoImpl.java
public abstract class DefaultDaoImpl<T> {
private EntityManager em;
public void beginTx() {
em = HibernateManager.getEntityManager();
em.getTransaction().begin();
}
public void commitTx() {
em.getTransaction().commit();
em.close();
}
(...)
}