MyBatis- MySQLへの接続はランダムにドロップします
質問
*更新:オープン後にセッションを閉じない方法を見つけました。これが原因かもしれないと思います。後でテストしてレポートします。 *
GWT Java WebアプリケーションでMyBatisを使用しています。問題は、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.");
}
解決
私にとって問題は解決しました。私はセッションを開いていたすべての方法と1つのセッションが閉じられていませんでした - コーディングエラー。したがって、接続プールは時々自由な接続がなくなった。
所属していません StackOverflow