package net.tooan.ynpay.commons.service.ibatis;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ibatis.sqlmap.engine.impl.SqlMapClientImpl;
import com.ibatis.sqlmap.engine.transaction.TransactionConfig;
import com.ibatis.sqlmap.engine.transaction.TransactionManager;
import com.ibatis.sqlmap.engine.transaction.external.ExternalTransactionConfig;
import net.tooan.ynpay.third.jfinal.log.Logger;
import javax.sql.DataSource;
import java.io.Reader;
import java.nio.charset.Charset;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created with IntelliJ IDEA.
* User: Jing
* Date: 13-10-15
* Time: 下午10:07
*/
public class SqlMapClientUtils {
private static final Logger logger = Logger.getLogger(SqlMapClientUtils.class);
private static ConcurrentHashMap<String, SqlMapClient> cache = new ConcurrentHashMap<String, SqlMapClient>();
public static SqlMapClient getSqlMapClient(DataSource ds, String resource) {
SqlMapClient sqlMapClient = cache.get(resource);
if (logger.isDebugEnabled()) {
logger.debug(String.format("sqlMapClientCache.get(%s), %s", resource, (sqlMapClient == null) ? "No cache" : "Cached"));
}
if (sqlMapClient == null) {
synchronized (cache) {
try {
Resources.setCharset(Charset.forName("UTF-8"));
Reader reader = Resources.getResourceAsReader(resource);
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
TransactionConfig transactionConfig = new ExternalTransactionConfig();
transactionConfig.setDataSource(ds);
Properties properties = new Properties();
properties.setProperty("SetAutoCommitAllowed", "false");
transactionConfig.setProperties(properties);
TransactionManager txManager = new TransactionManager(transactionConfig);
((SqlMapClientImpl) sqlMapClient).getDelegate().setTxManager(txManager);
cache.put(resource, sqlMapClient);
} catch (Exception e) {
if (logger.isErrorEnabled()) {
logger.error(e.getMessage(), e);
}
throw new RuntimeException(String.format("初始化ibatis[%s]失败", resource), e);
}
}
}
return sqlMapClient;
}
}