以下是来自Hibernate.xml的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。所以我想保持数据库连接最小化。 请指导我。
答案 0 :(得分: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
服务中。