2015-09-16 20 views
2

下面是我的hibernate.xml文件這個文件,對於sql中的任何查詢我都會使用會話工廠進行查詢,但是在這裏我使用的是屬性名dataSource,它被引用到數據庫中連接,所以對於每一個查詢我打電話會話工廠,併爲每個調用它調用dataSource並建立一個新的連接,而不是我想只做一個連接,併爲每個請求做出多個查詢一個是可能的如何讓jdbc mysql數據庫連接生效

我正在使用休眠的SQL查詢

我使用下面的hibernate.xml,因爲我從http://www.mkyong.com/spring/maven-spring-hibernate-mysql-example/

hibernate.xml:

<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> 
    </props> 
</property> 

<property name="mappingResources"> 
<list> 
     <value>resources/database/Token.xml</value> 
</list> 
    </property> 

</bean> 

datasource.xml:

<bean id="dataSource" 
     class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/get"/> 
    <property name="username" value="root"/> 
    <property name="password" value="password"/> 
    <property name="initialSize" value="3"/> 
    <property name="minPoolSize" value="1" /> 
<property name="maxPoolSize" value="3" /> 
</bean> 

</beans> 

更新:我已經做了我的代碼,連接池,但是如何使其在打開應用程序的啓動只有一個連接併爲每個請求使用相同的連接

正如你所看到的每一個會話工廠的調用它調用dataSource它使一個連接我想要停止它

+0

你怎麼知道它不斷重新打開新的連接?你可以附上日誌來證實這一點嗎? –

+0

,因爲它調用dataSourse bean每次我認爲它會重新打開連接,我會檢查日誌,並來bak – Labeo

回答

1

兩個考慮因素。 首先,你可以配置所有的bean只有一個xml文件,而不需要爲hibernate和spring保留不同的文件(Spring的就足夠了)。

其次:您可以使用支持池連接和更多配置的數據源,如C3P0。 如何宣稱它的一個例子是:

<bean id="yourDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
    <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/get" /> 
    <property name="user" value="username" /> 
    <property name="password" value="password" /> 
    <property name="minPoolSize" value="1" /> 
    <property name="maxPoolSize" value="3" /> 
    <property name="preferredTestQuery"> 
     <value>select null from dual</value> 
    </property> 
    <property name="testConnectionOnCheckin"> 
     <value>true</value> 
    </property> 
    <property name="idleConnectionTestPeriod"> 
     <value>1000</value> 
    </property> 
    </bean> 
+0

是的我可以使連接池,但之後,我打電話會議工廠,每次它是一個數據庫連接我想要的解決方案嗎?我得到了連接池解決方案謝謝 – Labeo

+0

看到上面的更新 – Labeo

1

如果要重新使用連接,則需要使用支持連接池的DataSource實現。 示例here用於dbcp庫。還有Tomcat的實現。

爲了使用它,您需要將庫添加到依賴項中,並使用實現類和連接池的配置值更新DataSource的配置。

+0

是的我可以做連接池,但之後,每次請求我打電話會話工廠,每次它是一個數據庫連接我想要解決這個問題嗎?我得到了連接池的解決方案謝謝 – Labeo

+0

請參閱上面的更新 – Labeo

1

我不知道我理解你的問題,但是,你如何配置SessionFactory的?你的sessionfactory是一個spring bean嗎?

如果是spring bean,那麼默認情況下它是單例,這意味着只有一個sessionfactory實例存在於整個應用程序中並且是共享的。在這種情況下,你假設你正在創建一個新的sessionfactory,然後創建一個新的數據源是錯誤的。

如果您在代碼中手動創建sessionfactory,那麼您需要自己實現單例設計模式。

private static SessionFactory seesionFactory = null; 

    private static final SessionFactory makeSessionFactory() 
    { 
     try { 
         if (sessionFactory==null) 
      seesionFactory = new Configuration().configure().buildSessionFactory(); 
     } catch (HibernateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return seesionFactory;  
    }