簡體   English   中英

應用程序運行幾個小時后出現黑屏

[英]Application hits blank screen after running for couple hours

我們最近將我們的服務器從 Tomcat 6 升級到 Tomcat 9 並且一直遇到應用程序每隔幾個小時就會停機的問題。 到目前為止我收集到的一些要點:

  • 系統在本地機器上沒有任何錯誤地加載,這只發生在生產站點上。
  • 該應用程序運行 6-7 小時,然后遇到此白屏問題。
  • 重新啟動 Tomcat 服務器后,系統會再次恢復幾個小時,然后重復整個過程。
  • 它通常會在幾個小時后出現連接問題,並且當發生這種情況時,數據庫中的客戶端連接似乎非常高。

這是 Tomcat 中記錄的內容。在調試時,用戶不是 null,所以我不確定真正的問題是什么。 我不確定我是否需要重做數據庫的連接,或者這是 Tomcat 的配置問題。

26-Jan-2022 11:23:46.614 SEVERE [https-jsse-nio-443-exec-6] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [jsp] in context with path [] threw exception [An exception occurred processing [jsp/index.jsp] at line [86]

83: <%
84:     AccountInfo accountInfo = new AccountInfo();
85:     String user = testOBJECTS.getName();
86:     accountInfo.init(user);
87:   



Stacktrace:] with root cause
    java.lang.IllegalStateException: Failed to get connection..
        at test.library.TestConnectionFactory.getConnection(Unknown Source)
        at test.model.AccountInfo.init(Unknown Source)
        at org.apache.jsp.jsp.index_jsp._jspService(index_jsp.java:248)
        at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:379)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:327)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1726)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)

這是獲取用戶的 index.jsp 頁面中的代碼。

<jsp:useBean id="testOBJECTS" class="test.mainJspBean"/>
<jsp:useBean id="testTop" class="test.loggedInBean"/>
<jsp:useBean id="aircraftFolder" class="test.library.AircraftFolder"/>
<% 
  testOBJECTS.setLogin(request);
    if (testOBJECTS.getLoggedIn()) {
     testTop.setServletTop(request, testOBJECTS.getLoggedIn(), null, testOBJECTS.getName());

    AccountInfo accountInfo = new AccountInfo();
    String user = testOBJECTS.getName();
    accountInfo.init(user);
    
    }
%>

這是設置用戶的 MainJspBean.java class。

package test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;

import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.LogManager;

import test.library.SubscribeConnectionFactory;
import test.loginLibraries.Login;

public class mainJspBean
{
    static Logger log = LogManager.getLogger(mainJspBean.class.getName());
    private String clientPage = "";
    private boolean loggedIn = false;
    private String name = "";

    public String getLogin()
    {
        return clientPage;
    }

    public void setLogin(HttpServletRequest request) throws SQLException {
        String user = (String) request.getSession().getAttribute(Login.UID);
        String pass = (String) request.getSession().getAttribute(Login.PASS);
        boolean loggedin = loggedInBean.isLoggedIn(user, pass);
        if (loggedin) {
            this.loggedIn = loggedin;
            name = user;
            System.out.println("name: " + name);
            
            clientPage += "<div align=\"justify\" class=\"style1\"><a href=\"https://" + IPs.WebAddress() + "/jsp/index.jsp\">TEST Online</a></div>\n";
        } else {
            clientPage += "<br><FORM  autocomplete=\"off\" METHOD=\"post\" ACTION=\"https://"+ IPs.WebAddress() +"/test/login\" onSubmit=\"return checkWhiteSpace()\">\n" +
                      "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" align=\"right\" valign=\"top\">\n" +
                      "<tr>\n" +
                      "<td nowrap align=\"right\" ><span class=\"topText\" align=\"right\">User Name:&nbsp;</span><input type=\"text\" name=\"uid\" id=\"uid\" size=\"8\" ></td>\n" +
                      "</tr>\n" +
                      "<tr>\n" +
                      "<td nowrap align=\"right\" ><span class=\"topText\" align=\"right\">Password:&nbsp;</span><input type=\"password\" name=\"auth\" size=\"8\"></td>\n" +
                      "</tr>\n" +
                      "<tr>\n" +
                      "<td nowrap colspan=\"2\" align=\"right\" ><input type=\"checkbox\" name=\"remember\" value=\"1\" checked>&nbsp;<span " + "class=\"topText\">Remember me.</span></td>\n" +
                      "</tr>\n" +   
                      "<tr>\n" +
                      "<td align=\"right\" colspan=\"2\"><input type=\"submit\" class=\"IP\" name=\"login\" value=\"Login\">\n" +                           
                      "<a href=\"https://" + IPs.WebAddress() + "/payAsYouGoSignUp.jsp\">Register</a></td>\n" +
                      "</tr>\n" +
                
                      "</table>\n" +
                      "<script type=\"text/javascript\">\n" +
                      "<!--\n" +
                      "function checkWhiteSpace() {\n" +
                      "  var s = document.getElementById(\"uid\").value;\n"+
                      "   // Check for white space\n" +
                      "  if (s.indexOf(\" \") > -1) {\n" +
                      "      jAlert(\"The User Name that you entered contains a white space.\");\n" +
                      "      return false;\n" +
                      "  }\n" +
                      "  return true;\n" +
                      "}\n" +
                      "//-->\n" +
                      "</script>\n" +
                      "</form>\n";          
        }
      }
    

    public String getWebAddress()
    {
        return IPs.WebAddress();
    }

    public boolean getLoggedIn()
    {
        return loggedIn;
    }

    public String getName()
    {
        return name;
    }
}

這是實際的 TestConnection 頁面。

public class TestConnectionFactory {
    static final Runtime RUNTIME = Runtime.getRuntime();
    static Logger log = LogManager.getLogger(TestConnectionFactory.class.getName());
    DataSource ds = null;
    long connectCount;
    /**
     * A handle to the unique Singleton instance.
     */
    static private TestConnectionFactory instance = null;

    /**
     * The constructor could be made private
     * to prevent others from instantiating this class.
     * But this would also make it impossible to
     * create instances of Singleton subclasses.
     */
    protected TestConnectionFactory() {
        log.debug("<init> freeMemory:"+RUNTIME.freeMemory());
        if (ds == null) {
            ds = getDataSource();
        }
    }

    /**
     * @return The unique instance of this class.
     */
    static public synchronized TestConnectionFactory getInstance() {
        if (instance == null) {
            log.info("getInstance():creating new instance");
            instance = new TestConnectionFactory();
            log.debug("getInstance():reusing existing instance");
        }
        return instance;
    }

    public Connection getConnection() {
        Connection connection = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

            try {
                connection = ds.getConnection();

            } catch (SQLException e) {
                e.printStackTrace();
            }
            return connection; 
           
    }

我試過的是指tomcat 中的這個 Java web 應用程序會定期凍結帖子,因為問題聽起來與我的應用程序類似,但修復無效。 我嘗試過的事情:

  • 更改 context.xml 文件中的 maxWaitMillis 和 maxActive。
  • 增加客戶端數據庫連接總數。
  • 在Java代碼中為null用戶設置陷阱。

更新 getConnection() 方法似乎解決了我的問題。

public Connection getConnection() {
    Connection connection = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;

        try {
            connection = ds.getConnection();

        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection; 
       
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM