Java 读取循环上的Hibernate Mysql异常

Java 读取循环上的Hibernate Mysql异常,java,mysql,hibernate,Java,Mysql,Hibernate,我在select“get”查询循环中遇到此异常。 你能告诉我如何避免这种情况吗 2014-01-21 18:54:36 [WARN]SqlExceptionHelper:143 SQL Error: 0, SQLState: 08S01 2014-01-21 18:54:36 [ERROR]SqlExceptionHelper:144 Communications link failure due to underlying exception: ** BEGIN NESTED E

我在select“get”查询循环中遇到此异常。 你能告诉我如何避免这种情况吗

2014-01-21 18:54:36 [WARN]SqlExceptionHelper:143    SQL Error: 0, SQLState: 08S01
2014-01-21 18:54:36 [ERROR]SqlExceptionHelper:144   Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: No buffer space available (maximum connections reached?): connect

STACKTRACE:

java.net.SocketException: No buffer space available (maximum connections reached?): connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at java.net.Socket.<init>(Unknown Source)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:271)
    at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
    at com.mysql.jdbc.Connection.<init>(Connection.java:1555)
    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.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:173)
    at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriver(DriverManagerDataSource.java:164)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnectionFromDriver(AbstractDriverBasedDataSource.java:149)
    at org.springframework.jdbc.datasource.AbstractDriverBasedDataSource.getConnection(AbstractDriverBasedDataSource.java:119)
    at org.hibernate.service.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:141)
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:279)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1309)
    at org.springframework.orm.hibernate4.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:399)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:371)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:335)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:105)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    at com.cinebot.db.Dao$$EnhancerByCGLIB$$7e1b7d44.getIngresso(<generated>)
    at com.cinebot.service.LogAnalyzerService.processLogFile(LogAnalyzerService.java:273)
    at com.cinebot.service.LogAnalyzerService.check(LogAnalyzerService.java:119)
    at com.cinebot.service.LogAnalyzerThreadService$AnalisiLog.run(LogAnalyzerThreadService.java:55)
    at com.cinebot.thread.StatusThreadStep.doStep(StatusThreadStep.java:91)
    at com.cinebot.thread.ThreadAbstractService.process(ThreadAbstractService.java:57)
    at com.cinebot.service.LogAnalyzerThreadService.run(LogAnalyzerThreadService.java:37)
    at java.lang.Thread.run(Unknown Source)


** END NESTED EXCEPTION **



Last packet sent to the server was 0 ms ago.
查询循环非常简单,有一个类似这样的循环,叫做>20000次

dao.get(Entitiy.call,id)

我试图添加session.flush()session.clear(),但在16000次查询后仍然出现错误。

根据您更新的帖子,我分析可能是hibernate在返回结果后未释放数据库连接。因为数据库服务器进入了巨大的负载

我建议:

-使用
session.flush()
session.clear()
session.get(Entity.class,id)之后

-设置时,您正在执行
session.get(Entity.class,id)循环内检查您不是每次都创建SessionFactory。实现一个提供静态SessionFactory的类

-尝试实现与或任何其他人的连接池

更新(与提供静态SessionFactory的类相关)

当您使用hibernate对DB执行任何事务/操作时,您将需要一个
会话
会话
负责DB状态、操作(CRUD)。您将从一个
SessionFactory
获取会话,该会话是通过读取hibernate配置创建的,如
hibernate.cfg.xml

要构建sessionFactory,我们使用
sessionFactory sessionFactory=new Configuration().configure().buildSessionFactory()如果您在循环中调用此代码,那么这将给您带来更多麻烦

我的想法是创建一个类,该类将具有
静态SessionFactory
,该类将在spring上下文加载时使用
DI
创建

plz到达了我使用HibernateHelper_DI.xml发布HibernateHelper.java代码的地方,它将在加载上下文时创建静态sessionFactory

当您需要sessionFactory提供的
会话时,您只需调用:

Session session = HibernateHelper.getSession();
//work with session
session.flush();
session.clear();

buildSessionFactory()
在Hibernate 4中已被弃用,现在我们必须使用
buildSessionFactory(ServiceRegistry ServiceRegistry)
您可以在
HibernateHelper
中找到新方法您实现了连接池吗?您可以检查mysql服务器中有多少个连接吗?否,Spring web应用程序中只有一个org.springframework.orm.hibernate4.LocalSessionFactoryBean您可以发布代码块吗?可以与hibernate.connection.release\u模式相关吗?它的默认relese行为是什么?似乎有些东西填满了会话内存,我也尝试用thread.sleep减慢进程,但进程在同一点停止。是否可以强制重新启动hibernate会话?使用
c3p0
和一些代码审核的连接池解决了我的
已达到的最大连接数?
问题。感谢您的回答。你能再解释一下第二个建议吗?有一点信息需要回答,请检查并纠正我的错误。我用更多关于getSession()方法的信息更新了我的问题。我尝试了你的前两个建议,但我没有解决。使用hibernate的LocalSessionFactoryBean,我的sessionbuilder已经是静态的(我检查它记录每个查询的da对象)。根据方法
get(Class classe,Serializable id)
session.flush()
session.clear()
中的上次更新,未使用。和您在循环中调用的方法相同,对吗?
public class DataSourceSelector extends DriverManagerDataSource {

    private String catalog;
    private static Logger logss = Logger.getLogger(DataSourceSelector.class);

    public String getCatalog(){
        return catalog;
    }

    public DataSourceSelector(){
        super();
        String adb=DbConnector.getActiveDb();
        if(!StringUtils.isBlank(adb)){                  
            setDriverClassName("com.mysql.jdbc.Driver");
            catalog=adb;
            setUrl("jdbc:mysql://localhost/"+catalog);
            logss.info("Selezionato DB: "+catalog);
            setUsername("cin_java");
            setPassword("password");
        }
    }

}
dao.get(Entitiy.call,id)
Session session = HibernateHelper.getSession();
//work with session
session.flush();
session.clear();