2011-03-17 23 views
3

在java方面,一切正常,但是當我查看V $ SESSION特殊的oracle表,並在我的日誌表中記錄任何登錄或註銷操作時,這是一場災難......每個查詢都會執行登錄/註銷操作。所以,這裏是我的問題:有什麼辦法可以配置Spring與數據庫有唯一的連接,或者在連接的方式上有什麼問題? 在這裏,我的數據源bean的配置:在HibernateTemplate和SessionFactory上的單一數據庫連接

<bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <property name="driverClassName"> 
      <value>oracle.jdbc.OracleDriver</value> 
     </property> 
     <property name="url"> 
      <value>jdbc:oracle:thin:@nanssunorad:1523:nanorad3</value> 
     </property> 
     <property name="username"> 
      <value>foo</value> 
     </property> 
     <property name="password"> 
      <value>bar</value> 
     </property> 
    </bean> 
<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="configLocation"> 
     <value>hibernateESign.cfg.xml</value> 
    </property> 
    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
    <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
    </property> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory" /> 
    </property> 
</bean> 
<bean id="IXalVaParametresDAO" class="fr.asterion.archivage.hibernate.XalVaParametresDAO"> 
    <property name="sessionFactory"> 
     <ref local="sessionFactory" /> 
    </property> 
</bean> 

在我的應用程序,以獲取數據庫參數的DAO,我做了

IXalVaParametresDAO parametreDAO = (IXalVaParametresDAO) ConfigApplication 
      .getApplicationContext(this.log).getBean("IXalVaParametresDAO"); 

,最後,在我的DAO類,我做些事情像這樣:

public class XalVaParametresDAO implements IXalVaParametresDAO 
{ 

    private HibernateTemplate hibernateTemplate; 

    public void setSessionFactory(SessionFactory sessionFactory) 
    { 
     this.hibernateTemplate = new HibernateTemplate(sessionFactory); 
    } 



    public List<XalVaParametres> findAll() 
    { 
     log.debug("finding all XalVaParametres instances"); 
     try 
     { 
     String queryString = "from XalVaParametres"; 
     List lst = this.hibernateTemplate.find(queryString); 

在我的應用程序,每一個我稱之爲「發現」的方法時,它確實DB登錄/註銷。我猜這個問題在另一個數據庫上是一樣的。我正確地做事情嗎?我猜不會。我希望HibernateTemplate能創建並保持會話一勞永逸。那可能嗎 ? 感謝您的想法

Manux

回答

4
+0

好,我用Apache的BasicDataSource嘗試過,效果非常好!正如axtavt所說的那樣,DriverManagerDataSource的使用不會因爲連接句柄不正確而被阻止。謝謝大家的迴應。 – M4nux 2011-03-18 16:25:53

+0

@ M4nux歡迎您,但您也應該接受我們的答案之一(點擊勾號) – 2011-03-18 16:36:10

+0

您解決了我的問題!非常感謝你!! – 2012-12-28 08:52:23

3

它不建議在生產中使用DriverManagerDataSource,因爲它不執行連接池。

您需要改用連接池,例如c3p0Apache DBCP

0

您可以使用原生的Oracle數據源與像連接緩存:

<bean id="myDataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close"> 
     <property name="connectionCachingEnabled" value="true"/> 
     <property name="URL"> 
      <value>${jdbc.url}</value> 
     </property> 
     <property name="user"> 
      <value>${jdbc.username}</value> 
     </property> 
     <property name="password"> 
      <value>${jdbc.password}</value> 
     </property> 
     <property name="connectionCacheProperties"> 
      <value> 
       MinLimit:1 
       MaxLimit:1 
       InitialLimit:1 
       ConnectionWaitTimeout:120 
       InactivityTimeout:180 
       ValidateConnection:true 
       MaxStatementsLimit:0 
      </value> 
     </property> 
    </bean> 
+0

那麼,它不工作...相同的多重連接問題。 – M4nux 2011-03-18 16:28:22

1

其更好地使用應用程序服務器的連接池,並指定在Spring的XML文件中的JNDI:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jdbc/DSTest"/> 
</bean>