【问题标题】:Mysqldump launched by tomcat cause OutOfMemoryError if tomcat uses datasource如果tomcat使用数据源,tomcat启动的Mysqldump会导致OutOfMemoryError
【发布时间】:2013-10-23 07:55:54
【问题描述】:

由于某种原因,我现在决定将我的 webapp 连接方法从简单的托管连接更改为池化数据源。一切正常,除了 mysqldump 在 BufferedReader 的迭代期间导致 OutOfMemoryError 之外。正如您在此处粘贴的代码中看到的那样,我尝试通过运行外部进程来进行转储...所以我无法弄清楚为什么会出现此异常。

谁能帮帮我?

/**
     * esegue il comando mysqldump e inserisce il risultato in un array di byte che poi verrà restituito sotto forma di stringa
     * @return
     * @throws Exception
     */
    private String getData() throws Exception {

        Process run = null;
        InputStream inErr = null;
        BufferedReader brErr = null;
        StringBuffer tempErr = null;
        InputStream in = null;
        BufferedReader br = null;
        StringBuffer temp = null;

        try {
            int count;
            char[] cbuf = new char[BUFFER];

            // esegue il backup con mysqldump
            run = Runtime.getRuntime().exec("mysqldump --host=" + host + " --port=" + port + " --user=" + user + " --password=" + password + " " + db);

            // prima gestisce un eventuale errore
            inErr = run.getErrorStream();
            brErr = new BufferedReader(new InputStreamReader(inErr));
            tempErr = new StringBuffer();

            if (inErr.available() != 0) {
                while ((count = brErr.read(cbuf, 0, BUFFER)) != -1)
                    tempErr.append(cbuf, 0, count);
            }

            brErr.close();
            inErr.close();

            // scrive il testo dell'errore in un file
            if (tempErr.toString().length() != 0) {
                // scrive l'errore nel file di log
                scriviErrInLog(tempErr.toString());
                throw new Exception("Errore nel backup del database");
            }

            // ora gestisce un
            in = run.getInputStream();
            br = new BufferedReader(new InputStreamReader(in));
            temp = new StringBuffer();

            //System.out.println("creato input stream --- in.available() =  " + in.available());

            if ((count = br.read(cbuf, 0, BUFFER)) != -1) { 
                //System.out.println("sto per scrivere nel file");
                temp.append(cbuf, 0, count);

                br.mark(BUFFER);
                br.reset();

                while ((count = br.read(cbuf, 0, BUFFER)) != -1) {
                    temp.append(cbuf, 0, count);
                }

                //System.out.println("scritto");

                br.close();
                in.close();
                run.destroy();
            } else
                throw new BackupException("Errore nel backup del database: backup vuoto");

        } catch (Exception e) {

            br.close();
            in.close();

            brErr.close();
            inErr.close();

            run.destroy();

            throw e;
        }

        return temp.toString();
    }

谢谢

ott 15, 2013 3:51:08 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon

警告:连接已被放弃 PooledConnection[com.mysql.jdbc.JDBC4Connection@1c3e12b]:java.lang.Exception 在 org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:976) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:730) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:586) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174) 在 org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:124) 在 qbnuovo.dao.DBManager.openConnection(DBManager.java:174) 在 qbnuovo.dao.DBManager.exeQuery(DBManager.java:60) 在 qbnuovo.dao.TurnoDAO.selectPianoLavoro(TurnoDAO.java:2116) 在 qbnuovo.dao.TurnoDAO.selectPianoLavoro(TurnoDAO.java:2072) 在 qbnuovo.service.TurnoService.selectPianoLavoro(TurnoService.java:577) 在 qbnuovo.command.VisualizzaConsuntivoCommand.execute(VisualizzaConsuntivoCommand.java:294) 在 qbnuovo.web.RequestProcessor.perform(RequestProcessor.java:49) 在 qbnuovo.web.EventController.processRequest(EventController.java:144) 在 qbnuovo.web.EventController.doGet(EventController.java:184) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(Unknown Source)

MySqlBackup: prima di getData 线程“http-bio-8080-exec-1”中的异常 java.lang.OutOfMemoryError:Java 堆空间 在 java.util.Arrays.copyOf(未知来源) 在 java.lang.AbstractStringBuilder.expandCapacity(未知来源) 在 java.lang.AbstractStringBuilder.ensureCapacityInternal(未知来源) 在 java.lang.AbstractStringBuilder.append(未知来源) 在 java.lang.StringBuffer.append(未知来源) 在 qbnuovo.helper.MysqlBackup.getData(MysqlBackup.java:351) 在 qbnuovo.helper.MysqlBackup.eseguiBackup(MysqlBackup.java:272) 在 qbnuovo.dao.DBManager.eseguiBackupInterno(DBManager.java:710) 在 qbnuovo.dao.DBManager.eseguiBackupDatabase(DBManager.java:461) 在 qbnuovo.command.CambioDataCommand.execute(CambioDataCommand.java:124) 在 qbnuovo.web.RequestProcessor.perform(RequestProcessor.java:49) 在 qbnuovo.web.EventController.processRequest(EventController.java:144) 在 qbnuovo.web.EventController.doPost(EventController.java:193) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 在 org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 你可以显示日志以便更好地理解吗?

标签: java mysql tomcat


【解决方案1】:

问题是你试图将整个 mysql 转储保存在内存中,这必然会以这种错误结束。它与池化数据源没有任何关系。 尝试逐行处理转储,就像从输入流中读取一样。

【讨论】:

  • 你的意思是尝试逐行写入转储文件而不是逐行添加到StringBuffer?
  • 是的,这可能是一个解决方案。但如果这就是你需要做的,你可以在运行 mysqldump 时重定向输出,使用 > dumpfile.sql
  • 这是个好主意,但是使用重定向执行此命令我收到一个错误,告诉我 > 不是数据库表...?!
  • 这里的问题是runtime不是shell,所以无法识别重定向stackoverflow.com/questions/12380054/…
猜你喜欢
  • 2014-12-31
  • 2014-04-04
  • 2014-06-08
  • 1970-01-01
  • 2014-05-15
  • 2019-03-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
相关资源
最近更新 更多