Spring Boot, SQL Server, AKS, соединение закрыто - PullRequest
0 голосов
/ 03 декабря 2018

У нас есть приложение весенней загрузки, работающее через AKS (Azure Kubernetes Service).В сервисе мы внедряем и вызываем класс инициатора процедуры:

package com.thing;

import javax.persistence.EntityManager;
import javax.persistence.ParameterMode;
import javax.persistence.PersistenceContext;
import javax.persistence.StoredProcedureQuery;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class ProcedureInvoker {

@PersistenceContext
private final EntityManager entityManager;

@Autowired
public ProcedureInvoker(final EntityManager entityManager) {
    this.entityManager = entityManager;
}


public int getValueCall(String user, String password) {


    StoredProcedureQuery storedProcedureQuery = entityManager.createStoredProcedureQuery("dbo.CHECK_USER");


    // In out parameters
    storedProcedureQuery.registerStoredProcedureParameter(1, String.class, ParameterMode.IN);
    storedProcedureQuery.registerStoredProcedureParameter(2, String.class, ParameterMode.IN);
    storedProcedureQuery.registerStoredProcedureParameter(3, Integer.class, ParameterMode.INOUT);


    //
    storedProcedureQuery.setParameter(1, user);
    storedProcedureQuery.setParameter(2, password);
    storedProcedureQuery.setParameter(3, new Integer(-3));

    Object result = storedProcedureQuery.getOutputParameterValue(3);

    storedProcedureQuery.execute();

    int resu = ((Integer)result).intValue();

    return resu; 
}

}

Иногда (после 1 дня или нескольких часов работы должным образом; около 3000 вызовов) мы начинаем получать эту ошибку:

com.microsoft.sqlserver.jdbc.SQLServerException:
   at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError 
(SQLServerException.java227)
   at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed 
(SQLServerConnection.java796)
   at com.microsoft.sqlserver.jdbc.SQLServerConnection.setNetworkTimeout 
(SQLServerConnection.java4768)
   at com.zaxxer.hikari.pool.PoolBase.setNetworkTimeout (PoolBase.java541)
   at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection 
(PoolBase.java129)
   at com.zaxxer.hikari.pool.HikariPool.lambda$closeConnection$1 
(HikariPool.java434)
   at java.util.concurrent.ThreadPoolExecutor.runWorker 
(ThreadPoolExecutor.java1149)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run 
(ThreadPoolExecutor.java624)
   at java.lang.Thread.run (Thread.java748)

Чтобы решить эту проблему, мы удаляем модули, чтобы перезапустить их.Но это не решение.

Пом имеет:

<!--  DDBB -->
    <dependency>
        <groupId>com.microsoft.sqlserver</groupId>
        <artifactId>mssql-jdbc</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <!-- End DDBB -->

Свойства от yaml

spring.datasource.driverClassName: 
com.microsoft.sqlserver.jdbc.SQLServerDriver
spring.jpa.show-sql: false
spring.jpa.hibernate.dialect: org.hibernate.dialect.SQLServer2012Dialect
spring.jpa.properties.hibernate.format_sql: true
logging.level.org.hibernate.type: debug

решено !!Наконец, мы решили это, добавив:

entityManager.close()

Мы думали, что предложение не является необходимым для процедур или функций (оно было закрыто весной).

Проблема, вероятно, исходит от SQL Server, потому чтоУ процедуры есть оператор возврата, который не объявлен (у нас были некоторые проблемы с вызовом из Spring).Может быть, SQL-сервер делегирует закрытие соединения с пружиной, а Spring делает противоположное (делегирование на SQL-сервер)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...