2013-08-02 4 views
1

Я пытаюсь получить некоторые данные для пользователей. Код работает отлично, когда данные малы около 5000 строк. Но когда я пытаюсь получить данные о размере 25000 + строк прикладных аварии дают следующее исключение с StackTrace:Connection Исключение извлечения больших данных из mysql

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException: Cannot open connection
 
    Caused by: org.hibernate.exception.JDBCConnectionException: Cannot open connection
 
     at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
 
     at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:29)
 
     at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:420)
 
     at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
 
     at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:129)
 
     at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:57)
 
     at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1290)
 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:516)
 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:315)
 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:234)
 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:93)
 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:209)
 
     at $Proxy1.getAggregatedFeaturesByCode(Unknown Source)
 
     at com.ilrn.session.permissions.PermissionManagerImpl.handleFeatureGroup(PermissionManagerImpl.java:164)
 
     at com.ilrn.session.permissions.PermissionManagerImpl.buildUserPermissionMap(PermissionManagerImpl.java:142)
 
     at com.ilrn.entity.sql.SqlUser.getUserPermissions(SqlUser.java:2720)
 
     at com.ilrn.controller.modules.UsersReport.addResults(UsersReport.java:384)
 
     at com.ilrn.controller.modules.UsersReport.gen_main(UsersReport.java:229)
 
     at com.ilrn.controller.modules.UsersReport.generate(UsersReport.java:156)
 
     at com.ilrn.controller.ShellModule.generateShell(ShellModule.java:2016)
 
     at com.ilrn.controller.Application.processRequest(Application.java:1462)
 
     at com.ilrn.controller.BCAServlet.performTask(BCAServlet.java:197)
 
     at com.ilrn.controller.BCAServlet.doPost(BCAServlet.java:172)
 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 
     at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:174)
 
     at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 
     at com.ilrn.session.webservices.axisws.clientactivity.ForceResponseCode200Filter.doFilter(ForceResponseCode200Filter.java:24)
 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 
     at com.ilrn.util.RequestDumperFilter.doFilter(RequestDumperFilter.java:273)
 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 
     at com.ilrn.controller.filters.ReferenceFilter.doFilter(ReferenceFilter.java:57)
 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 
     at com.ilrn.controller.filters.WebContextFilter.doFilter(WebContextFilter.java:60)
 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 
     at com.ilrn.util.DynamicRequestsFilter.doFilter(DynamicRequestsFilter.java:113)
 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:856)
 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:744)
 
     at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
 
     at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
 
     at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
 
     at java.lang.Thread.run(Thread.java:595)
 
    Caused by: com.mysql.jdbc.CommunicationsException: The driver was unable to create a connection due to an inability to establish the client portion of a socket. 

    This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable. 

    For Unix-based platforms, see the manual page for the 'ulimit' command. Kernel or system reconfiguration may also be required. 

    For Windows-based platforms, see Microsoft Knowledge Base Article 196271 (Q196271).
 
     at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1112)
 
     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
 
     at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332)
 
     at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369)
 
     at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
 
     at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
 
     at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:377)
 
     at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
 
     at java.sql.DriverManager.getConnection(DriverManager.java:525)
 
     at java.sql.DriverManager.getConnection(DriverManager.java:140)
 
     at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291)
 
     at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277)
 
     at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259)
 
     at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241)
 
     at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
 
     at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
 
     ... 56 more
 
    Caused by: java.net.BindException: Address already in use: connect
 
     at java.net.PlainSocketImpl.socketConnect(Native Method)
 
     at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
 
     at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
 
     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
 
     at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:364)
 
     at java.net.Socket.connect(Socket.java:507)
 
     at java.net.Socket.connect(Socket.java:457)
 
     at java.net.Socket.<init>(Socket.java:365)
 
     at java.net.Socket.<init>(Socket.java:207)
 
     at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
 
     at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
 
     ... 70 more
 

У меня есть маленький ключ, что приложение пытается сделать несколько соединений и превышает предел для количества соединений? мне нужно сделать, чтобы увеличить этот лимит, как это предлагается в самом

This is usually caused by a limit on the number of sockets imposed by the operating system. This limit is usually configurable.

Если так StackTrace, как сделать это? Любая помощь будет оценена по достоинству.

+0

У вас есть пул соединений, настроенный для спящего режима (например, c3po)? – Pyranja

+0

да. ** hibernate.c3p0.min_size = 1 ** ** hibernate.c3p0.max_size = 20 ** – harsh

+0

Судя по stacktrace, ваш пул соединений настроен неправильно. Обратите внимание, что «ConnectionManager» Hibernate делегирует «DriverManagerDataSource» Spring. Его [javadoc] (http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/jdbc/datasource/DriverManagerDataSource.html) указывает: _NOTE: этот класс не является фактическим пулом соединений; он фактически не объединяет Connections_. Поэтому спящий режим может создавать чрезмерное количество соединений, нарушая ограничение ОС. – Pyranja

ответ

1

увеличить максимальный размер вашего пула соединений, а также использовать пакетное обновление:

установка пакетный размер

hibernate.jdbc.batch_size 20 

и пакетное обновление будет что-то вроде этого:

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 

ScrollableResults customers = session.getNamedQuery("GetCustomers") 
    .setCacheMode(CacheMode.IGNORE) 
    .scroll(ScrollMode.FORWARD_ONLY); 
int count=0; 
while (customers.next()) { 
    Customer customer = (Customer) customers.get(0); 
    customer.updateStuff(...); 
    if (++count % 20 == 0) { 
     //flush a batch of updates and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 

tx.commit(); 
session.close(); 

reference here , Если у вас по-прежнему возникает такая же проблема, отправьте конфигурацию c3p0, возможно, что-то не так.

+0

На самом деле я не обновляю значения, я просто извлекаю данные из базы данных. Как я могу получить помощь от пакетной обработки (например, как получить данные в пакетах) – harsh

+0

пакетная обработка предназначена только для обновления (добавление/редактирование/удаление), это предотвратит утечку памяти для слишком большого количества построенных sql. для выбора вы можете вместо этого использовать что-то вроде '.setFirstResult (int i)' и '.setMaxResults (int n)'. – Angga

Смежные вопросы