Java 休眠问题:“;“连接太多”;

Java 休眠问题:“;“连接太多”;,java,hibernate,Java,Hibernate,我得到以下错误: . . . . 6844 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1040, SQLState: 08004 6844 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Data source rejected establishment of connection, message from server: "Too ma

我得到以下错误:

.
.
.
.
6844 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 1040, SQLState: 08004
6844 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Data source rejected establishment of connection,  message from server: "Too many connections"
Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Cannot open connection
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
    at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
    at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:160)
    at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
    at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
    at sun.reflect.GeneratedMethodAccessor121.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:345)
    at $Proxy0.beginTransaction(Unknown Source)
    at com.mycomp.myproj.matcher.Matcher.findMatch(Matcher.java:228)
    at com.mycomp.myproj.Confidence.Confidence.main(Confidence.java:160)
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.Util.getInstance(Util.java:384)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1105)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2186)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:787)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:49)
    at sun.reflect.GeneratedConstructorAccessor16.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at java.sql.DriverManager.getConnection(Unknown Source)
    at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133)
    at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
    ... 11 more
。
.
.
.
6844[main]WARN org.hibernate.util.jdbceptionreporter-SQL错误:1040,SQLState:08004
6844[main]错误org.hibernate.util.jdbceptionReporter-数据源拒绝建立连接,来自服务器的消息:“连接太多”
线程“main”org.hibernate.Exception.jdbconnectionexception中出现异常:无法打开连接
位于org.hibernate.exception.sqlstatecoverter.convert(sqlstatecoverter.java:99)
位于org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:66)
位于org.hibernate.exception.jdbceptionhelper.convert(jdbceptionhelper.java:52)
位于org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449)
位于org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
位于org.hibernate.jdbc.jdbcontext.connection(jdbcontext.java:160)
位于org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:81)
位于org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1473)
位于sun.reflect.GeneratedMethodAccessor121.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke处(未知源)
位于java.lang.reflect.Method.invoke(未知源)
位于org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:345)
在$Proxy0.beginTransaction(未知来源)
在com.mycop.myproj.matcher.matcher.findMatch(matcher.java:228)上
在com.mycop.myproj.Confidence.Confidence.main上(Confidence.java:160)
原因:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:数据源拒绝建立连接,来自服务器的消息:“连接太多”
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:409)
位于com.mysql.jdbc.Util.getInstance(Util.java:384)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
位于com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
位于com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1105)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2186)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:787)
位于com.mysql.jdbc.JDBC4Connection(JDBC4Connection.java:49)
位于sun.reflect.GeneratedConstructor Accessor16.newInstance(未知源)
位于sun.reflect.delegatingConstructor或AccessorImpl.newInstance(未知源)
位于java.lang.reflect.Constructor.newInstance(未知源)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:409)
位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
位于java.sql.DriverManager.getConnection(未知源)
位于java.sql.DriverManager.getConnection(未知源)
位于org.hibernate.connection.driverManager连接提供者.getConnection(driverManager连接提供者.java:133)
位于org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
... 还有11个
我的程序的休眠部分如下所示:

for loop_1        // this will execute say 2000 times 
{
    for loop_2       // this will execute say 1000 times
    {
        // Opening 2 sessions for 2 different databases

        Configuration config_1 = new Configuration().configure("Hibernate_1.cfg.xml");
        SessionFactory sessionFactory_1 = config_1.buildSessionFactory();
        Session session_1 = sessionFactory_1.getCurrentSession();
        session_1.beginTransaction();

        Configuration config_2 = new Configuration().configure("Hibernate_2.cfg.xml");
        SessionFactory sessionFactory_2 = config_2.buildSessionFactory();
        Session session_2 = sessionFactory_2.getCurrentSession();
        session_2.beginTransaction();

        doInsertDb_1(some_object_1, session_1);

        doUpdateDb_2(some_object_2, session_2);
    }
}

    public int doInsertDb_1(Object obj, Session session) {

        try {

            session.save(obj);
            session.flush();
            session.getTransaction().commit();

            return 1;

        } catch (Exception ex) {
            ex.printStackTrace();
            return 0;
        }
    }

    public int doUpdate_2(Object obj, Session session) {

        try {

            Query query = session.createQuery("" <Creating some query> );
            query.executeUpdate();
            session.getTransaction().commit();

            return 1;

        } catch (Exception ex) {
            ex.printStackTrace();
            return 0;
        }
    }
对于循环\u 1//这将执行2000次
{
对于循环_2//这将执行1000次
{
//为2个不同的数据库打开2个会话
Configuration config_1=new Configuration().configure(“Hibernate_1.cfg.xml”);
SessionFactory SessionFactory_1=config_1.buildSessionFactory();
Session Session_1=sessionFactory_1.getCurrentSession();
会话_1.beginTransaction();
Configuration config_2=new Configuration().configure(“Hibernate_2.cfg.xml”);
SessionFactory SessionFactory_2=config_2.buildSessionFactory();
Session Session_2=sessionFactory_2.getCurrentSession();
会话2.beginTransaction();
doInsertDb_1(一些_对象_1,会话_1);
doUpdateDb_2(某些对象_2,会话_2);
}
}
public int doInsertDb_1(对象对象,会话){
试一试{
session.save(obj);
session.flush();
session.getTransaction().commit();
返回1;
}捕获(例外情况除外){
例如printStackTrace();
返回0;
}
}
公共int doUpdate_2(对象对象,会话){
试一试{
Query=session.createQuery(“”);
query.executeUpdate();
session.getTransaction().commit();
返回1;
}捕获(例外情况除外){
例如printStackTrace();
返回0;
}
}
很明显,在某个地方,我没有正确地关闭连接。我不知道在哪里?有人能给我介绍一下吗


非常感谢。

尝试在循环之外创建会话

您确定每次都需要通过循环创建两个会话吗?在两个循环之前创建一次它们可能会解决您的问题并加快代码的速度。但是,如果您坚持在内部循环中打开它们,请确保之后
close()
它们,因为这样至少可以释放您正在打开(但从不关闭)的数据库连接

编辑:在完成所有更改之前,您应该推迟提交更改,以免过早关闭连接


编辑2:由于您需要每次更新的结果来处理进一步的更新,您至少可以将会话工厂的创建移到循环之外。

谢谢您的回复。我试图在外部创建它们