下面是我的hibernate.xml文件这个文件,对于sql中的任何查询我将使用会话工厂进行查询但是在这里我使用属性名称dataSource,它被引用到数据库连接,所以对于我调用的每个查询会话工厂和每次调用它调用dataSource并建立一个新的连接而不是我想只做一个连接并为每个请求做一个多个查询是否可能
我正在使用hibernate进行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 :(得分:1)
如果要重用连接,则需要使用支持连接池的DataSource
实现。
示例here适用于dbcp库。还有Tomcat实施。
为了使用它,您需要将库添加到依赖项中,并使用实现类和连接池的配置值更新DataSource的配置。
答案 1 :(得分:1)
两个考虑因素。 首先,您可以只在一个xml文件中配置所有bean,不需要为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>
答案 2 :(得分:1)
我不确定我理解你的问题,但是,你如何配置你的sessionfactory?你的sessionfactory是一个春天豆吗?
如果它是spring bean,那么它默认为singleton,这意味着整个应用程序只存在一个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;
}