Mybatis - соединение с MySQL случайным образом падает

StackOverflow https://stackoverflow.com/questions/6356131

  •  28-10-2019
  •  | 
  •  

Вопрос

*Обновление: я нашел метод, который не закрыл сеанс после открытия. Я думаю, что это может быть причиной. Будет тестировать и сообщить позже. *

Мы используем Mybatis с нашим веб -приложением GWT Java. Проблема в том, что иногда случается исключение при попытке читать или записать в базу данных с Mybatis. Что может быть причиной? Любые последующие запросы будут работать. Кажется, что соединение истекло и должно быть обновлено. Иногда это происходит в течение дня, мы не видим ни одного шаблона в этом. Мы пробовали разные конфигурации безрезультатно.

org.apache.ibatis.exceptions.PersistenceException: 
### Error opening session.  Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.

Файл конфигурации mybatis:

<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC" />
        <dataSource type="POOLED">
            <property name="driver" value="com.mysql.jdbc.Driver"/>     

            <property name="url" value="jdbc:mysql://localhost/project"/>
            <property name="username" value="username"/>
            <property name="password" value="password"/>

            <property name="poolMaximumActiveConnections" value="20"/>
            <property name="poolMaximumIdleConnections" value="5"/>
            <property name="poolPingEnabled" value="true"/>
            <property name="poolPingQuery" value="select 1"/>

        </dataSource>
    </environment>
</environments>

Обновление 1Исключение брошено в различных «DAO», оно не относится к одному методу/вызову. Общий метод может выглядеть так:

@Override
public Entity get(String id) throws Exception {
    LogHelper.logMethodStart(logger, "get", "id", id);

    SqlSession session = null;
    try {
        session = GenericDao.SESSION_FACTORY.openSession();
        EntityDao mapper = session.getMapper(EntityDao.class);
        return mapper.get(id);
    } catch (Exception e) {
        logger.error(e);
        throw e;
    } finally {
        if (session != null) {
            session.close();
        }
    }

}

Где состоит класс сессии: из:

public static SqlSessionFactory SESSION_FACTORY;

static {
    logger.info("SqlSessionFactory init started.");

    String aResource = "iBatisConfig.xml";
    Reader reader;
    try {
        reader = Resources.getResourceAsReader(aResource);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
    SESSION_FACTORY = new SqlSessionFactoryBuilder().build(reader);

    try {
        reader.close();
    } catch (IOException e) {
        logger.error(e);
    }

    SESSION_FACTORY.getConfiguration().addMappers("com.example.project.server.dao");

    logger.info("SqlSessionFactory init end.");
}
Это было полезно?

Решение

Проблема решила для меня. Я пошел, хотя все методы, которые открывали сеанс, и один сеанс не был закрыт - ошибка кодирования. Таким образом, в пуле соединений иногда не хватает свободного соединения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top