2

*更新: 開いた後にセッションを閉じない方法を見つけました。これが原因ではないかと思います。後でテストして報告します。*

GWT Java Web アプリケーションで MyBatis を使用しています。問題は、MyBatis を使用してデータベースを読み書きしようとすると、例外が発生することがあるということです。原因は何ですか?後続のクエリはすべて機能します。接続がタイムアウトしたようで、更新する必要があります。これは 1 日を通して時々発生しますが、これにはパターンは見られません。さまざまな構成を試しましたが、役に立ちませんでした。

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.");
}
4

1 に答える 1

2

問題は解決しました。セッションを開いているすべてのメソッドを調べましたが、1 つのセッションが閉じられませんでした - コーディング エラーです。そのため、接続プールの空き接続が不足することがありました。

于 2011-07-26T11:55:20.767 に答える