package cn.uncode.dal.core;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.ObjectUtils;
import cn.uncode.dal.asyn.AsynContext;
import cn.uncode.dal.asyn.AsynSQLTask;
import cn.uncode.dal.asyn.Method;
import cn.uncode.dal.cache.CacheManager;
import cn.uncode.dal.criteria.Model;
import cn.uncode.dal.criteria.QueryCriteria;
import cn.uncode.dal.criteria.QueryCriteria.Criteria;
import cn.uncode.dal.descriptor.Column;
import cn.uncode.dal.descriptor.ForeignKey;
import cn.uncode.dal.descriptor.QueryResult;
import cn.uncode.dal.descriptor.Table;
import cn.uncode.dal.descriptor.db.ResolveDataBase;
import cn.uncode.dal.descriptor.resolver.JavaType;
import cn.uncode.dal.descriptor.resolver.JavaTypeConversion;
import cn.uncode.dal.descriptor.resolver.JavaTypeResolver;
import cn.uncode.dal.event.EventManager;
import cn.uncode.dal.event.asyn.EventContext;
import cn.uncode.dal.exception.DalSqlException;
import cn.uncode.dal.internal.util.message.Messages;
import cn.uncode.dal.router.DefaultMasterSlaveRouter;
import cn.uncode.dal.router.MasterSlaveRouter;
import cn.uncode.dal.router.TableShardingRouter;
import cn.uncode.dal.utils.BeanUtil;
import cn.uncode.dal.utils.JsonUtils;
import cn.uncode.dal.utils.ShardsUtils;
public abstract class AbstractBaseDAL implements BaseDAL {
private static final Logger LOG = LoggerFactory.getLogger(AbstractBaseDAL.class);
public static final String CACHE_KEY_PREFIX = "uncode_dal_";
private static final String CACHE_KEY_SELECT_BY_CRITERIA = "_selectByCriteria_";
private static final String CACHE_KEY_COUNT_BY_CRITERIA = "_countByCriteria_";
private static final String CACHE_KEY_SELECT_PAGE_BY_CRITERIA = "_selectPageByCriteria_";
private static final String CACHE_KEY_SELECT_BY_IDS = "_selectPageByIds_";
public static final String CACHE_KEY_SELECT_BY_PRIMARY_KEY = "_selectByPrimaryKey_";
protected CacheManager cacheManager;
protected ResolveDataBase resolveDatabase;
protected MasterSlaveRouter router = new DefaultMasterSlaveRouter();
protected boolean useCache = true;
protected String version;
protected List<String> versionTables;
protected List<String> listenerNames;
/**
* 采用“需要缓存的”来筛选
*/
protected boolean useCacheFilter = true;
protected List<String> noCacheTables;
protected List<String> cacheTables;
//-------------------------
// 异步
//-------------------------
/**
* 日志队列
*/
private BlockingQueue<AsynContext> sqlQueue;
/**
* 写线程池
*/
private ExecutorService asynWriterService;
/**
* 异步日志线程池大小
*/
private int asynWriterThreadSize = 5;
private List<AsynSQLTask> tasks = new ArrayList<AsynSQLTask>();
public AbstractBaseDAL() {
noCacheTables = new ArrayList<String>();
cacheTables = new ArrayList<String>();
sqlQueue = new LinkedBlockingQueue<AsynContext>();
asynWriterService = Executors.newFixedThreadPool(asynWriterThreadSize);
// for (int i = 0; i < asynWriterThreadSize; i++) {
AsynSQLTask task = new AsynSQLTask(this);
task.setLogQueue(sqlQueue);
tasks.add(task);
asynWriterService.submit(task);
// }
LOG.info("Asyn dal init ok!");
}
//-------------------------------------------------------------------
// 抽象方法
//-------------------------------------------------------------------
public abstract List<Map<String, Object>> _selectByCriteria(final Table table);
public abstract int _countByCriteria(final Table table);
public abstract Map<String, Object> _selectByPrimaryKey(final Table table);
public abstract long _insert(Table table);
public abstract int _insertList(Table table);
public abstract int _updateByCriteria(Table table);
public abstract int _updateByPrimaryKey(Table table);
public abstract int _deleteByPrimaryKey(Table table);
public abstract int _deleteByCriteria(Table table);
//-------------------------------------------------------------------
// 业务核心方法实现-selectPageByCriteria
//-------------------------------------------------------------------
@Override
public QueryResult selectPageByCriteria(QueryCriteria queryCriteria) {
return selectPageByCriteria(queryCriteria, 5000);
}
@Override
public QueryResult selectPageByCriteria(String[] fields, QueryCriteria queryCriteria) {
return selectPageByCriteria(fields, queryCriteria, 5000);
}
@Override
public QueryResult selectPageByCriteria(List<String> fields, QueryCriteria queryCriteria) {
return selectPageByCriteria(fields, queryCriteria, 5000);
}
@Override
public QueryResult selectPageByCriteria(QueryCriteria queryCriteria, int seconds) {
String cacheKey = generateMultiSelectCacheKey(null, queryCriteria, CACHE_KEY_SELECT_PAGE_BY_CRITERIA);
QueryResult queryResult = null;
if (TableShardingRouter.containsTable(queryCriteria.getTable())) {
queryResult = ShardsUtils.shardingSelectPageByCriteria(asynWriterService, this, queryCriteria, null);
} else {
int total = countByCriteria(queryCriteria, seconds);
if (total > 0) {
int pageCount = total / queryCriteria.getPageSize();
if (total % queryCriteria.getPageSize() != 0) {
pageCount++;
}
if (queryCriteria.getPageIndex() > pageCount) {
queryCriteria.setPageIndex(pageCount);
}
queryResult = selectByCriteria(queryCriteria, seconds);
Map<String, Object> page = new HashMap<String, Object>();
page.put(PAGE_INDEX_KEY, queryCriteria.getPageIndex());
page.put(PAGE_SIZE_KEY, queryCriteria.getPageSize());
page.put(PAGE_COUNT_KEY, pageCount);
page.put(RECORD_TOTAL_KEY, total);
queryResult.setPage(page);
}
}
if (queryResult != null) {
if (cacheManager != null && cacheManager.getCache() != null && useCache) {
cacheManager.getCache().putObject(buildTableCacheSpace(queryCriteria), cacheKey, queryResult, seconds);
}
}
return queryResult;
}
@Override
public QueryResult selectPageByCriteria(String[] fields, QueryCriteria queryCriteria, int seconds) {
QueryResult queryResult = null;
String cacheKey = generateMultiSelectCacheKey(null, queryCriteria, CACHE_KEY_SELECT_PAGE_BY_CRITERIA);
if (TableShardingRouter.containsTable(queryCriteria.getTable())) {
queryResult = ShardsUtils.shardingSelectPageByCriteria(asynWriterService, this, queryCriteria, Arrays.asList(fields));
} else {
int total = countByCriteria(queryCriteria, seconds);
if (total > 0) {
int pageCount = total / queryCriteria.getPageSize();
if (total % queryCriteria.getPageSize() != 0) {
pageCount++;
}
if (queryCriteria.getPageIndex() > pageCount) {
queryCriteria.setPageIndex(pageCount);
}
queryResult = selectByCriteria(fields, queryCriteria, seconds);
Map<String, Object> page = new HashMap<String, Object>();
page.put(PAGE_
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
Uncode-DAL是 Java 通用数据访问组件,基于mybatis、spring jdbc、hibernate等ORM框架开发,同时支持基于多数据源的读写分离、主备切换、故障转移,自动恢复、负载均衡、缓存等。可以大大提高开发速度
资源推荐
资源详情
资源评论
收起资源包目录
Uncode-DAL是 Java 通用数据访问组件基于mybatis、spring jdbc、hibernate等ORM框架开发 (212个子文件)
version.bat 843B
spring.factories 274B
.gitignore 859B
.gitignore 9B
.gitignore 9B
config.ini 1KB
config.ini 1KB
AbstractBaseDAL.java 63KB
AbstractMongoDAL.java 29KB
AbstractCommonDAL.java 26KB
StringUtils.java 26KB
QueryCriteria.java 25KB
BaseDAL.java 24KB
AbstractTemplate.java 23KB
ShardsUtils.java 22KB
Mongo3DAL.java 19KB
ConfigBuilder.java 17KB
GenerateRunningMain.java 17KB
JsonUtils.java 16KB
CommonJdbcSupport.java 13KB
DbUtil.java 12KB
AbstractTemplateEngine.java 11KB
DynamicDataSource.java 11KB
QueryResult.java 11KB
BeanUtil.java 11KB
AbstractSQL.java 10KB
Connection.java 8KB
TableShardingRouter.java 8KB
MongoDataBase.java 8KB
BeanUtil.java 7KB
Model.java 7KB
StrategyConfig.java 7KB
ThreadLocalCacheManager.java 7KB
MybatisDALTest.java 7KB
SimpleResolveDatabase.java 7KB
MongoTest.java 6KB
CommonDAL.java 6KB
SqlTemplate.java 6KB
Content.java 6KB
MultiDataSourcesTransactionManager.java 5KB
TableInfo.java 5KB
ServiceUtil.java 5KB
Criterion.java 5KB
MongoDAL.java 5KB
DataSourceAutoConfiguration.java 5KB
Table.java 5KB
PackageHelper.java 5KB
SpringJDBCTest.java 4KB
EventContext.java 4KB
DataSourceProperties.java 4KB
UncodeDALAutoConfiguration.java 4KB
NamingStrategy.java 4KB
UserServiceImpl.java 4KB
StringEscape.java 4KB
TableField.java 4KB
OprateInfo.java 4KB
MySqlTypeConvert.java 4KB
JavaTypeResolver.java 3KB
Dictionarymapping.java 3KB
CommonMapper.java 3KB
SlavesDataSourceConfig.java 3KB
ShardsDataSource.java 3KB
StringPool.java 3KB
JavaTypeConversion.java 3KB
ObjectFactory.java 3KB
AsynSQLTask.java 3KB
StringUtil.java 2KB
NotifyTask.java 2KB
GlobalConfig.java 2KB
CustomDataSourceConfig.java 2KB
DbColumnType.java 2KB
AsynMongoTask.java 2KB
ConstVal.java 2KB
SqlTemplate.java 2KB
MybatisDAL.java 2KB
WriterTask.java 2KB
AsynContext.java 2KB
LogListener.java 2KB
ForeignKey.java 2KB
EventManager.java 2KB
FreemarkerTemplateEngine.java 2KB
PackageConfig.java 2KB
AsynWriter.java 2KB
JavaType.java 2KB
ConcurrentMapCache.java 2KB
MongoDALAutoConfiguration.java 2KB
StandbyDataSourceConfig.java 2KB
MasterDataSourceConfig.java 2KB
RoutingDatabaseAutoConfiguration.java 2KB
UserController.java 2KB
RoutingDatabaseInterceptor.java 2KB
Column.java 2KB
ShardsQueryCallable.java 2KB
InjectionConfig.java 2KB
BaseDTO.java 2KB
SpringJDBCDAL.java 2KB
DefaultShardingStrategy.java 2KB
ShardsBatchCallable.java 2KB
UncodeDALConfig.java 2KB
Messages.java 2KB
共 212 条
- 1
- 2
- 3
资源评论
Java程序员-张凯
- 粉丝: 1w+
- 资源: 6656
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功