programing

com.vmdk.jdbc.exceptions.jdbc4.MySQL NonTransient 연결예외:연결이 닫힌 후에는 작업이 허용되지 않습니다.

topblog 2023. 8. 21. 19:26
반응형

com.vmdk.jdbc.exceptions.jdbc4.MySQL NonTransient 연결예외:연결이 닫힌 후에는 작업이 허용되지 않습니다.

애플리케이션을 구축하고 로컬로 배포했습니다. 완벽하게 작동했습니다.원격 서버에 배포하고 제목 줄에 언급된 예외를 받기 시작했습니다.방화벽 문제 때문이 아닙니다.

나는 나의 것을 바꿨습니다.hibernate.xml로컬 호스트가 아닌 내 IP 주소를 통해 연결할 수 있습니다. 이제 로컬로 배포된 애플리케이션에서 동일한 시간 초과가 발생합니다.응용 프로그램을 하루 이상 실행하면 이 오류가 발생합니다.

저는 거래를 커밋하거나 세션을 종료한 후에는 어떠한 작업도 수행하지 않습니다.는 다음속사있다니습고용하을에 다음 .hibernate.cfg.xml

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="hibernate.connection.url">jdbc:mysql://myremotehost:3306/akp</property>
        <property name="hibernate.connection.username">root</property>
        <property name="hibernate.connection.password">root</property>
        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>

원인: com.myql.jdbc.exceptions.jdbc4.MySQL NonTransient 연결예외:연결이 닫힌 후에는 작업이 허용되지 않습니다.연결이 드라이버에 의해 암시적으로 닫혔습니다.

세부 정보:

 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed by the driver.
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
      at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
      at com.mysql.jdbc.Util.getInstance(Util.java:384)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
      at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
      at com.mysql.jdbc.ConnectionImpl.throwConnectionClosedException(ConnectionImpl.java:1193)
      at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1180)
      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4137)
      at com.mysql.jdbc.ConnectionImpl.prepareStatement(ConnectionImpl.java:4103)
      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
      at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:423)
      at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
      at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
      at org.hibernate.loader.Loader.doQuery(Loader.java:673)
      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
      at org.hibernate.loader.Loader.doList(Loader.java:2220)
      ... 36 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 34,247,052 milliseconds ago.  The last packet sent successfully to the server was 34,247,052 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
      at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
      at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
      at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1118)
      at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3321)
      at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1940)
      at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
      at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
      at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
      at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
      at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
      at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
      at org.hibernate.loader.Loader.doQuery(Loader.java:674)
      at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
      at org.hibernate.loader.Loader.doList(Loader.java:2220)
      at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
      at org.hibernate.loader.Loader.list(Loader.java:2099)
      at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)
      at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1569)
      at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
      at com.xyz.abc.DAO.GenericHibernateDAO.findByField(GenericHibernateDAO.java:119)
      at com.xyz.abc.DAO.JobDAO.getJobsByLdap(JobDAO.java:115)
      at com.xyz.abc.business.Jcr.getMyruns(Jcr.java:272)
      at com.xyz.abc.business.abcService.getMyruns(abcService.java:54)
      at sun.reflect.GeneratedMethodAccessor139.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.apache.axis2.rpc.receivers.RPCUtil.invokeServiceClass(RPCUtil.java:194)
      at org.apache.axis2.rpc.receivers.RPCMessageReceiver.invokeBusinessLogic(RPCMessageReceiver.java:102)
      at org.apache.axis2.receivers.AbstractInOutMessageReceiver.invokeBusinessLogic(AbstractInOutMessageReceiver.java:40)
      at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
      at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)
      at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:173)
      at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:142)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:203)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:108)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:379)
      at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:242)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:259)
      at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:237)
      ... 4 more
Caused by: java.net.SocketException: Software caused connection abort: socket write error

이 행동의 원인이 뭔지 아는 사람?

편집: 지금 내 hibernate.cfg.xml 파일에서 다음을 사용하고 있습니다.맞나요?

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/xyz</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">root</property>
    <property name="hibernate.show_sql">false</property>
    <property name="hibernate.current_session_context_class">thread</property>
    <property name="hibernate.query.factory_class">org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
<!-- <property name="hibernate.c3p0.max_size">1800</property>-->
    <property name="hibernate.c3p0.max_statements">50</property>

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="c3p0.max_statements">0</property>
    <property name="c3p0.maxIdleTimeExcessConnections">3600</property>
    <property name="c3p0.idleConnectionTestPeriod">3600</property> 
    <property name="c3p0.maxIdleTime">3600</property>

@swanliu가 지적했듯이 연결 상태가 좋지 않기 때문입니다.
그러나 서버 시간 및 클라이언트 시간 제한을 조정하기 전에 먼저 더 나은 연결 풀링 전략을 사용하려고 합니다.

연결 풀링

최대 절전 모드 자체가 연결 풀링 전략이 최소임을 인정함

그러나 Hibernate의 자체 연결 풀링 알고리즘은 매우 초보적입니다.시작을 돕기 위한 것이며 프로덕션 시스템에서 사용하거나 성능 테스트를 위한 것이 아닙니다.최상의 성능과 안정성을 위해 타사 풀을 사용해야 합니다.hibernate.설정으로 만 하면 .연결 풀 관련 설정을 사용하는 pool_size 속성.최대 절전 모드의 내부 풀을 해제합니다.예를 들어, c3p0을 사용할 수 있습니다.
참조 자료: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/session-configuration.html 에 명시된 바와 같이,

개인적으로 사용합니다.C3P0그러나 다음을 포함하여 사용 가능한 다른 대안들이 있습니다.DBCP.
해 보세요.

아래는 내 애플리케이션에 사용되는 C3P0의 최소 구성입니다.

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="c3p0.acquire_increment">1</property> 
<property name="c3p0.idle_test_period">100</property> <!-- seconds --> 
<property name="c3p0.max_size">100</property> 
<property name="c3p0.max_statements">0</property> 
<property name="c3p0.min_size">10</property> 
<property name="c3p0.timeout">1800</property> <!-- seconds --> 

기본적으로 풀은 연결이 만료되지 않습니다."새로 고침"을 유지하기 위해 연결을 시간 경과에 따라 만료하려면 maxIdleTime 및/또는 maxConnectionAge를 설정합니다. maxIdleTime은 풀에서 삭제되기 전에 연결을 사용하지 않도록 허용해야 하는 시간을 정의합니다.maxConnectionAge는 설정된 시간(초)보다 오래 전에 데이터베이스에서 획득한 모든 연결을 강제로 삭제합니다.
조에참된명시와바같이:같:http://www.mchange.com/projects/c3p0/index.html#://www.mchange.com/projects/c3p0/index.html#managing_pool_size


구성 파일(참조)을 이전에 프로젝트에 복사하여 붙여 넣었기 때문에 업데이트했습니다.시간 초과는 문제를 이상적으로 해결해야 합니다. 만약 그것이 당신에게 효과가 없다면, 당신이 다음을 살펴볼 수 있을 이라고 생각합니다.

클래스 경로의 루트에 있어야 하는 "c3p0.properties" 파일을 만듭니다(즉, 응용 프로그램의 특정 부분에 대해 재정의할 수 없습니다).(참조)

# c3p0.properties
c3p0.testConnectionOnCheckout=true

이 구성을 사용하여 각 연결을 사용하기 전에 테스트합니다.그러나 사이트 성능에 영향을 미칠 수 있습니다.

연결이 너무 오랫동안 비활성 상태였기 때문에 MySQL이 데이터베이스 연결을 암시적으로 닫았습니다(34,247,052밀리초 ≈ 9.5시간).프로그램이 연결 풀에서 잘못된 연결을 가져오면 다음과 같은 문제가 발생합니다.MySQLNonTransientConnectionException: No operations allowed after connection closed.

MySQL은 다음을 제안합니다.

응용프로그램에서 사용하기 전에 연결 유효성을 테스트하거나, 클라이언트 시간 초과에 대해 서버 구성 값을 늘리거나, Connector/J 연결 속성을 사용하여 이 문제를 방지해야 합니다.

연결 풀을 사용하지 않으려면 이 작업을 수행할 수 있습니다. 연결이 끊어지면 .getCurrentSession() 대신 .openSession() 메서드를 새로 호출해야 합니다.

예:

SessionFactory sf = null;
// get session factory
// ...
//
Session session = null;
try {
        session = sessionFactory.getCurrentSession();
} catch (HibernateException ex) {
        session = sessionFactory.openSession();
}

Mysql을 사용하는 경우 autoReconnect 속성을 설정할 수 있습니다.

    <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1/database?autoReconnect=true</property>

이것이 도움이 되길 바랍니다.

  1. 먼저 아래와 같이 MySQL 종속성 교체

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.44</version>
    </dependency>
    
  2. 인증 플러그인 'caching_sha2_password'를 표시하는 오류가 나타납니다.다음 명령을 실행합니다.

    mysql -u root -p
    ALTER USER 'username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
    

mysql에 따라 최신 jdbc 커넥터를 사용하고 있는지 확인하십시오.저는 이 문제에 직면했고 제가 이전에 쓰던 jdbc 커넥터를 최신 커넥터로 교체했을 때 문제가 해결되었습니다.

https://dev.mysql.com/downloads/connector/j/ 에서 최신 jdbc 드라이버를 다운로드할 수 있습니다.

운영 체제를 플랫폼 독립으로 선택합니다.두 가지 옵션이 표시됩니다.하나는 타르이고 하나는 지퍼입니다.zip을 다운로드하고 압축을 풀어서 jar 파일을 가져오고 이전 커넥터로 교체합니다.

이는 최대 절전 모드 프레임워크용일 뿐만 아니라 jdbc 커넥터가 필요한 모든 플랫폼에서 사용할 수 있습니다.

이는 구식 mysql-connection-java 버전을 사용하기 때문에 MySQL은 업데이트되지만 MySQL jdbc 드라이버는 업데이트되지 않습니다. 공식 사이트 MySQL Connector 사이트에서 연결 병을 업데이트할 수 있습니다.행운을 빌어요.

언급URL : https://stackoverflow.com/questions/7565143/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception-no-operati

반응형