2015-01-12 49 views
3

下面是從Hibernate.xml如何使用Hibernate處理最大數據庫連接?

Hibernate配置
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource"> 
     <ref bean="dataSource"/> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">update</prop> 
      <prop key="hibernate.c3p0.timeout">300</prop> 
     </props> 
    </property> 
    <property name="annotatedClasses"> 
     <list> 
     ..... 
     </list> 
    </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

下面是從GenricDaoImpl類代碼(碼1)

@Override 
public T save(T t) { 
    Session session = getSessionFactory().openSession(); 
    Transaction tx=session.beginTransaction(); 
    session.saveOrUpdate(t); 
    tx.commit(); 
    session.close(); 
    return t; 
} 

和從項目其它代碼(代碼2)

Query executeQuery = getSession().createQuery(hql); 
    UserProfileuser = (UserProfile) executeQuery.uniqueResult(); 

高於我在項目中使用的兩個代碼。我的問題是需要遵循哪些編碼?代碼1或代碼2以避免最大連接錯誤。我可以連接最多1000個連接數據庫。但在某些情況下,它會超過1000。所以我想保持數據庫連接最小。 請指導我。

回答

3

使用1000個數據庫連接聽起來不是一個好主意。每個額外的數據庫連接都需要額外的RAM,並增加了併發問題(死鎖)的可能性。

由於您使用C3P0你應該有一個最大連接尺寸:如果您運行的連接

<property name="hibernate.c3p0.min_size">5</property> 
<property name="hibernate.c3p0.max_size">20</property> 

那麼這可能是因爲:

  • 您不關閉休眠Session,並且關聯的JDBC連接不會釋放到池中
  • 您的查詢執行時間過長,因此它們不會足夠快地釋放連接

我推薦使用connection pool size utility(如FlexyPool)來更好地理解數據庫連接使用模式。

關於兩種選擇:

  • 的第一個例子矛盾由Spring提供的自動會話管理的支持。當你使用Spring時,你不應該自己管理Hibernate Sessions。您應該讓事務管理器在新的事務邊界上調用適當的Hibernate初始化回調。

    在您的示例中,如果會話引發異常,則會話將不會關閉,並且連接可能會懸停。這是因爲你沒有使用try/finally塊來釋放會話。

  • 第二個例子更好,但您需要將其包裝到@Transactional服務中。

+0

你能告訴我,不管是來自代碼1還是代碼2。如果我不關閉代碼1的連接,那麼它會每次都創建新的連接。或者它會使用現有的已打開的。 – RBP

+0

這是真的。作爲好奇心,我想知道,在代碼1中,我正在打開連接並正確關閉它,那麼爲什麼它會增加連接數。爲什麼連接沒有通過調用close()立即關閉?連接在一段時間後關閉,但直到那時它達到最大連接。 – RBP

+0

你怎麼知道你一次有超過1000個連接?大多數db只允許數百個。 –

相關問題