我正在使用Hibernate 3和mysql sever 5.5 for myweb application with spring 3.0
由于太多关系,我得到例外......
我创建会话的java文件如下:
public class DBConnection {
static{
}
public Session getSession(){
Session session = null;
SessionFactory sessionFactory= null;
sessionFactory = new Configuration().configure().buildSessionFactory();
session = sessionFactory.openSession();
return session;
}
}
Run Code Online (Sandbox Code Playgroud)
我在需要会话的地方调用这个方法
如
Session session=new DBConnection().getSession();
Run Code Online (Sandbox Code Playgroud)
之后
transaction.commit();
Run Code Online (Sandbox Code Playgroud)
我通过使用关闭会话
session.close();
Run Code Online (Sandbox Code Playgroud)
请帮我解决问题.......
我的hibernate.cfg.xml是:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/dbname</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">lax</property>
<property name="hibernate.connection.pool_size">100</property>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name=""></property>
<property name="hibernate.connection.release_mode">on_close</property>
</session-factory>
</hibernate-configuration>
Run Code Online (Sandbox Code Playgroud)
Lov*_*ija 24
这是因为您使用的是在构建SessionFactory时立即创建的连接池,但只有在您打开Session时才会获取连接.现在,您正在关闭会话,因为会话已释放,但未关闭并由池保留.现在,您再次创建一个SessionFactory,从而创建一个新池,然后获取一个会话,从而创建一个新的连接等等......最终将达到允许的最大连接数.
您需要做的是使用一个连接池(使用一个SessionFactory)并从同一个池获取和释放连接.
public class DBConnection {
private static SessionFactory factory;
static {
factory = new Configuration().configure().buildSessionFactory();
}
public Session getSession() {
return factory.openSession();
}
public void doWork() {
Session session = getSession();
// do work.
session.close();
}
// Call this during shutdown
public static void close() {
factory.close();
}
}
Run Code Online (Sandbox Code Playgroud)
SessionFactory每次需要 a 时都会创建新的sSession并且不要关闭它们。
通常您只需要在应用程序启动期间创建一次会话工厂,并在关闭期间关闭它。例如,如下:
public class DBConnection {
private static SessionFactory factory;
static {
factory = new Configuration().configure().buildSessionFactory();
}
public Session getSession() {
return factory.openSession();
}
// Call this during shutdown
public static void close() {
factory.close();
}
}
Run Code Online (Sandbox Code Playgroud)
另请查看上下文会话模式。