Java 读取循环上的Hibernate Mysql异常
我在select“get”查询循环中遇到此异常。 你能告诉我如何避免这种情况吗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
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();