Frage

*UPDATE: Ich habe eine Methode gefunden, die die Sitzung nach dem Öffnen nicht geschlossen hat. Ich denke, das könnte die Ursache sein. Wird später testen und melden. *

Wir verwenden MyBatis mit unserer GWT Java -Webanwendung. Das Problem ist, dass manchmal eine Ausnahme beim Versuch, mit MyBatis zu lesen oder in die Datenbank zu schreiben. Was könnte die Ursache sein? Alle nachfolgenden Abfragen funktionieren. Es scheint, als wäre die Verbindung zeitlich festgelegt und muss aktualisiert werden. Dies geschieht manchmal über den Tag, wir sehen kein Muster darin. Wir haben verschiedene Konfigurationen ohne Erfolg ausprobiert.

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.

Die MyBatis -Konfigurationsdatei:

<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>

Update 1Die Ausnahme wird in verschiedenen "DAOs" geworfen, sie ist nicht spezifisch für eine einzelne Methode/Aufruf. Eine allgemeine Methode könnte so aussehen:

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

}

Wo die Sitzungsfabrikklasse besteht:

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.");
}
War es hilfreich?

Lösung

Problem für mich gelöst. Ich ging, obwohl alle Methoden, die eine Sitzung öffneten, und eine Sitzung nicht geschlossen wurde - Codierungsfehler. So hat der Verbindungspool manchmal keine kostenlose Verbindung mehr mehr als

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top