【问题标题】:unable to connect connection No operations allowed after connection closed. error in Tomcat 7无法连接连接 连接关闭后不允许任何操作。 Tomcat 7 中的错误
【发布时间】:2013-12-21 21:55:40
【问题描述】:

这里我遇到了连接问题。

我在 Tomcat 7 中部署了一个 Web 服务。在该 Web 服务中,我使用了 Filter,在 init() 中,我调用了连接方法。

public static Connection connection = null;

    @Override
        public void init(FilterConfig config) throws ServletException {
        connection = ConnectionFactoryJndi.getConnection(); 
        }

现在我在整个应用程序中使用相同的连接对象。因此,通过这种方式,我只创建一个连接并执行 sql 查询。它运行良好。但是当我访问服务网址时;它给出错误“无法连接;连接关闭后没有操作”我还设置了 maxWait="28800000" 即 8 小时;最长持续时间。 我的问题是如何始终保持开放。或者当我访问 url 时,它不应该给出同样的错误并且能够自动连接。我正在使用 MySql。

这里是 server.xml 配置文件 -

  <Resource
        name="jdbc/xxxxx"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="200"
        maxIdle="30"
        maxWait="28800000"
        username="xxx"
        password="xxxxx"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost/xxxxx" />

在ConnectionFactoryJndi类中-

公共连接 createConnection() {

Connection connection = null;
try {
try {
envContext = new InitialContext();
} catch (NamingException e) {
}
Context initContext = null;
try {
initContext = (Context) envContext.lookup("java:/comp/env");
} catch (NamingException e) {
}
DataSource datasource = null;
try {
datasource = (DataSource) initContext.lookup("jdbc/xxxxxx");
} catch (NamingException e) {
System.out.println("Name not found");
}
connection = datasource.getConnection();
} catch (SQLException e) {
System.out.println("ERROR: Unable to Connect to Database.");
}
return connection;
}

请提出最佳做法。

谢谢。

服务器日志 -

Dec 05, 2013 10:09:44 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [ServletAdaptor] in context with path [/IntellixWebApi] threw exception
java.lang.NullPointerException
    at com.astroved.intellix.jdbc.dao.ClientDAO.getClientDetails(ClientDAO.java:44)
    at com.astroved.intellix.security.ValidateClient.isValidClient(ValidateClient.java:14)
    at com.astroved.intellix.security.SecurityFilter.doFilter(SecurityFilter.java:110)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

但是,由于连接失败,它即将到来;然后无法执行查询。

ClientDao 类 -

    ResultSet rs = null;
    try {
        try {
            statement = connection.createStatement();
        } catch (SQLException e) {
            log.error("Error in Client DAO class (unable to connect connection) "
                    + e.getMessage());
            // e.printStackTrace();
        }
        try {
            rs = statement.executeQuery(query);
        } catch (SQLException e) {
            log.error("Error in Client DAO class (unable to Execute Query ) "
                    + e.getMessage());
            // e.printStackTrace();
        }

        try {
            while (rs.next()) {
                client = new ClientTO();
                client.setClientId(rs.getInt("clientid"));
                client.setClientUrl(rs.getString("clienturl"));
                client.setClientSecurityKey(rs
                        .getString("clientserviceapiKey"));

                clientList.add(client);
            }
        } catch (SQLException e) {
            log.error("Error in Client DAO class ( Error in iteration ) "
                    + e.getMessage());
            // e.printStackTrace();
        }
    } finally {
        DbUtil.close(rs);
        DbUtil.close(statement);
        //DbUtil.close(connection);
    }

私人连接连接 = SecurityFilter.connection;

Server.xml -

 <Resource
        name="jdbc/xxxxx"
        auth="Container"
        type="javax.sql.DataSource"
        maxActive="200"
        maxIdle="30"
        maxWait="28800000"
        username="xxxxxx"
        password="xxxxxx"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost/xxxxxx" />


  </GlobalNamingResources>

客户端 DAO 类-

ResultSet rs = null;
try {
    try {
        connection = ConnectionFactoryJndi.getConnection();
        statement = connection.createStatement();
        rs = statement.executeQuery(query);
    } catch (SQLException e) {
        log.error("Error in Client DnaReportDao class (unable to Execute Query ) "+ e.getMessage());

    }

    try {
            if(rs != null) {
                while (rs.next()) {
                    codeValue = new DnaReportTO();
                    codeValue.setNature(rs.getString("Nature"));
                    codeValue.setInterestedSubject(rs.getString("InterestdSubject"));
                    codeValue.setTipToParent(rs.getString("TipsToParent"));
                }
            }

    } catch (SQLException e) {
        log.error("Error in DnaReportDao class ( Error in iteration ) "
                + e.getMessage());
    }
} finally {
    DbUtil.close(rs);
    DbUtil.close(statement);
}

当前服务器日志

Dec 05, 2013 12:22:22 PM com.sun.jersey.spi.container.ContainerResponse logException
SEVERE: Mapped exception to response: 500 (Internal Server Error)
javax.ws.rs.WebApplicationException: com.sun.jersey.api.MessageException: A message body writer for Java class com.astroved.intellix.resource.DnaReportResource, and Java type class com.astroved.intellix.resource.DnaReportResource, and MIME media type application/xml was not found
    at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:285)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1448)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1360)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1350)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.astroved.intellix.security.SecurityFilter.doFilter(SecurityFilter.java:112)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)
Caused by: com.sun.jersey.api.MessageException: A message body writer for Java class com.astroved.intellix.resource.DnaReportResource, and Java type class com.astroved.intellix.resource.DnaReportResource, and MIME media type application/xml was not found
    ... 27 more

ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.
ERROR: Unable to Connect to Database.

【问题讨论】:

  • 请同时发布堆栈跟踪。
  • 请发布tomcat日志
  • @Bennet 更新了 tomcat 日志。
  • @KeerthiRamanathan 更新了 tomcat 日志。

标签: java servlets jdbc tomcat7 jndi


【解决方案1】:

我在整个应用程序中使用相同的连接对象

这行不通。您应该使用连接池。否则,您必须自己做两件连接池会自动避免的事情:

  1. 确保每次使用时连接的活跃性,并且
  2. 确保单线程使用连接,这会彻底破坏服务器的性能。

不要这样做。使用 Tomcat 连接池。这很容易。

【讨论】:

  • 我在 tomcat 7 中使用 JNDI JNDI 连接池。因此获得了良好的性能。我认为他在代码 vlock 中错误地提到了。无论如何我正在关闭连接。否则,它在 4-5 个连接循环后挂起。感谢您的更新。
【解决方案2】:

从您在此处给出的错误看来,连接似乎已被应用程序关闭。错误no operation after connection closed 可能真的意味着您的应用程序中的某些东西正在关闭它。如果没有日志,就很难诊断出问题的原因。


使用连接池的正确方法是每次需要时借用一个连接。永远不要将您自己的类中的连接引用存储为单例或静态字段。这是因为池可能会在一段时间后回收连接,并且您最终会得到一个已关闭的有效连接对象。这也可能是您的问题的原因。正确的做法如下:

ResultSet rs = null;
try {
    try {
        connection = ConnectionFactoryJndi.getConnection(); //always do this everytime you need a conenction.
        statement = connection.createStatement();
    } catch (SQLException e) {
        log.error("Error in Client DAO class (unable to connect connection) "
                + e.getMessage());
        // e.printStackTrace();
    }
    try {
        if(statement != null){
            rs = statement.executeQuery(query);
        }else{
            //log error and return or throw exception
        }
    } catch (SQLException e) {
        log.error("Error in Client DAO class (unable to Execute Query ) "
                + e.getMessage());
        // e.printStackTrace();
    }

    try {
        if(rs != null){
            while (rs.next()) {
                client = new ClientTO();
                client.setClientId(rs.getInt("clientid"));
                client.setClientUrl(rs.getString("clienturl"));
                client.setClientSecurityKey(rs
                        .getString("clientserviceapiKey"));

                clientList.add(client);
            }
        }else{
            //log error and return or throw exception
        }
    } catch (SQLException e) {
        log.error("Error in Client DAO class ( Error in iteration ) "
                + e.getMessage());
        // e.printStackTrace();
    }
} finally {
    //close rs
    //close statement
    //never close a conenction
}

【讨论】:

  • 是的,昨天晚上 10 点以后我没有使用该服务。现在当我尝试使用它时@10 PM;它正在抛出错误。所以 Max Wait time is 8 hours 已经过期,我认为它会自动关闭。
  • 您使用的是静态连接实例吗?那是非常错误的。检查答案编辑。我已经为正确的方式添加了一个伪代码。
  • 您不应该在应用程序的任何地方都使用单一的失禁实例。问题是连接是一种资源。你不能让它活很长时间。如果您在任何地方都使用单个实例,则您的应用程序必然会出现此问题。正确的方法和最佳实践是使用连接池。池的想法是让您将应用程序从管理连接的麻烦中解放出来。您的池将为您管理连接对象的创建和关闭。
  • 它不会为每个请求创建一个新连接。这就是游泳池的想法。重用连接。你应该阅读一下连接池。
  • @Kumar “永远不要关闭连接”是完全不正确的。必须关闭它才能将其释放回连接池。 -1 表示这个重大错误。
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 2012-06-06
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2020-04-17
  • 2020-04-05
  • 1970-01-01
相关资源
最近更新 更多