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