与HibernateTemplate和SessionFactory的单一数据库连接

时间:2011-03-17 15:55:33

标签: java hibernate spring jdbc

在java方面,一切正常但是当我查看V $ SESSION特殊的oracle表,并在我的日志表中记录任何登录或注销操作时,这是一个灾难...每个查询都进行登录/注销操作。所以这是我的问题:有没有办法将Spring配置为与数据库建立唯一连接,或者我连接的方式有什么问题? 在这里,我的数据源bean配置:

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

在我的应用程序中,每次调用“find”方法时,都会进行数据库登录/注销。我猜这个问题在另一个DB上是一样的。我做对了吗?我猜不会。我希望HibernateTemplate能够一劳永逸地创建和保持会话。那可能吗 ? 谢谢你的想法

Manux

4 个答案:

答案 0 :(得分:5)

答案 1 :(得分:3)

建议不要在生产中使用DriverManagerDataSource,因为它不会执行连接池。

您需要使用连接池,例如c3p0Apache DBCP

答案 2 :(得分:1)

最好使用应用程序服务器的连接池并在spring xml文件中指定jndi:

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

答案 3 :(得分: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>