Question

* Mise à jour: je l'ai trouvé une méthode qui n'a pas fermé la session après Openning. Je pense que cela pourrait être la cause. Testera et compte plus tard. *

Nous utilisons mybatis avec notre application Web Java GWT. Le problème est que, parfois, une exception se produit tout en essayant de lire ou d'écrire dans la base de données avec mybatis. Quelle pourrait-être la cause? Toutes les requêtes suivantes fonctionneront. Il semble que la connexion expire et doit être réactualisé. Cela arrive parfois dans la journée, nous ne voyons pas de modèle dans ce domaine. Nous avons essayé différentes configurations sans résultat.

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.

Le fichier de configuration 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>

Mise à jour 1 L'exception est levée dans les différents « OTI », ce n'est pas spécifique à une seule méthode / appel. Une méthode générale pourrait ressembler à ceci:

@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();
        }
    }

}

Lorsque la classe d'usine de la session se compose de:

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.");
}
Était-ce utile?

La solution

Problème résolu pour moi. Je suis allé si toutes les méthodes qui ont été l'ouverture d'une session et une session n'a pas été en cours de fermeture - erreur de codage. Ainsi, le pool de connexion a manqué de connexion gratuite parfois.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top