¶Ô±ÈÐÂÎļþ |
| | |
| | | package org.dromara.generator.config; |
| | | |
| | | import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; |
| | | import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.anyline.data.datasource.DataSourceMonitor; |
| | | import org.anyline.util.ConfigTable; |
| | | import org.springframework.jdbc.core.JdbcTemplate; |
| | | import org.springframework.jdbc.datasource.DataSourceUtils; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.sql.DataSource; |
| | | import java.sql.Connection; |
| | | import java.sql.DatabaseMetaData; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | @Slf4j |
| | | @Component |
| | | public class MyBatisDataSourceMonitor implements DataSourceMonitor { |
| | | |
| | | public MyBatisDataSourceMonitor() { |
| | | // è°æ´æ§è¡æ¨¡å¼ä¸ºèªå®ä¹ |
| | | ConfigTable.KEEP_ADAPTER = 2; |
| | | } |
| | | |
| | | private final Map<String, String> features = new HashMap<>(); |
| | | |
| | | /** |
| | | * æ°æ®æºç¹å¾ ç¨æ¥å®å adapter å
嫿°æ®åºæJDBCåè®®å
³é®å<br/> |
| | | * ä¸è¬ä¼éè¿ äº§åå_url åæ å¦æè¿ånull ä¸å±æ¹æ³ä¼éè¿driver_产åå_urlåæ |
| | | * |
| | | * @param datasource æ°æ®æº |
| | | * @return String è¿ånullç±ä¸å±èªå¨æå |
| | | */ |
| | | @Override |
| | | public String feature(Object datasource) { |
| | | String feature = null; |
| | | if (datasource instanceof JdbcTemplate jdbc) { |
| | | DataSource ds = jdbc.getDataSource(); |
| | | if (ds instanceof DynamicRoutingDataSource) { |
| | | String key = DynamicDataSourceContextHolder.peek(); |
| | | feature = features.get(key); |
| | | if (null == feature) { |
| | | Connection con = null; |
| | | try { |
| | | con = DataSourceUtils.getConnection(ds); |
| | | DatabaseMetaData meta = con.getMetaData(); |
| | | String url = meta.getURL(); |
| | | feature = meta.getDatabaseProductName().toLowerCase().replace(" ", "") + "_" + url; |
| | | features.put(key, feature); |
| | | } catch (Exception e) { |
| | | log.error(e.getMessage(), e); |
| | | } finally { |
| | | if (null != con && !DataSourceUtils.isConnectionTransactional(con, ds)) { |
| | | DataSourceUtils.releaseConnection(con, ds); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | return feature; |
| | | } |
| | | |
| | | /** |
| | | * ConfigTable.KEEP_ADAPTER=2 : æ ¹æ®å½åæ¥å£å¤ææ¯å¦ä¿æåä¸ä¸ªæ°æ®æºç»å®åä¸ä¸ªadapter<br/> |
| | | * DynamicRoutingDataSourceç±»åçè¿åfalse,å 为åä¸ä¸ªDynamicRoutingDataSourceå¯è½å¯¹åºå¤ç±»æ°æ®åº, 妿项ç®ä¸åªæä¸ç§æ°æ®åº åºè¯¥ç´æ¥è¿åtrue |
| | | * |
| | | * @param datasource æ°æ®æº |
| | | * @return boolean |
| | | */ |
| | | @Override |
| | | public boolean keepAdapter(Object datasource) { |
| | | if (datasource instanceof JdbcTemplate jdbc) { |
| | | DataSource ds = jdbc.getDataSource(); |
| | | return !(ds instanceof DynamicRoutingDataSource); |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | } |