diff --git a/core/src/main/java/core/aop/Advisor.java b/core/src/main/java/core/aop/Advisor.java index 2e45084..546ba39 100644 --- a/core/src/main/java/core/aop/Advisor.java +++ b/core/src/main/java/core/aop/Advisor.java @@ -1,6 +1,7 @@ package core.aop; import core.dao.BaseDao1; +import core.dao.BaseDao2; import org.aopalliance.aop.Advice; import org.springframework.aop.support.StaticMethodMatcherPointcutAdvisor; import org.springframework.stereotype.Component; @@ -19,7 +20,7 @@ public class Advisor extends StaticMethodMatcherPointcutAdvisor { @Override public boolean matches(Method method, Class aClass) { - return BaseDao1.class.isAssignableFrom(aClass); + return BaseDao1.class.isAssignableFrom(aClass)||BaseDao2.class.isAssignableFrom(aClass); } @PostConstruct diff --git a/core/src/main/java/core/service/BaseService.java b/core/src/main/java/core/service/BaseService.java index 643394b..db38298 100644 --- a/core/src/main/java/core/service/BaseService.java +++ b/core/src/main/java/core/service/BaseService.java @@ -1,6 +1,7 @@ package core.service; import core.dao.BaseDao1; +import core.dao.BaseDao2; import core.util.DBAction; import db.model.AbstractModel; import org.apache.logging.log4j.LogManager; @@ -18,7 +19,10 @@ public class BaseService { protected Logger log=LogManager.getLogger(); @Resource - private BaseDao1 baseDao; + protected BaseDao1 baseDao1; + + @Resource + protected BaseDao2 baseDao2; public String curd(DBAction action, T command) { Class tClass = (Class) command.getClass(); @@ -26,21 +30,21 @@ public class BaseService { switch (action) { case C: case U: - baseDao.saveOrUpdate(command); + baseDao1.saveOrUpdate(command); break; case R: if(command.primaryKey()!=null) { - T model = baseDao.get(tClass, command.primaryKey()); + T model = baseDao1.get(tClass, command.primaryKey()); return model == null ? "找不到主键=" + command.primaryKey() + "" : model.toString(); }else{ throw new RuntimeException(command.getClass()+".primaryKey()方法返回null"); } case D: if(command.getCheckeds()==null) { - baseDao.delete(tClass, command.primaryKey()); + baseDao1.delete(tClass, command.primaryKey()); }else{ for (Serializable checked:command.getCheckeds()){ - baseDao.delete(tClass,checked); + baseDao1.delete(tClass,checked); } } break; @@ -53,6 +57,4 @@ public class BaseService { } - - } diff --git a/db/src/main/java/db/config/HibernateConfig.java b/db/src/main/java/db/config/HibernateConfig.java index bb9dc9c..0ee7b31 100644 --- a/db/src/main/java/db/config/HibernateConfig.java +++ b/db/src/main/java/db/config/HibernateConfig.java @@ -6,10 +6,8 @@ import org.apache.logging.log4j.Logger; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.orm.hibernate5.HibernateTransactionManager; import org.springframework.orm.hibernate5.LocalSessionFactoryBean; -import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.annotation.PostConstruct; import javax.sql.DataSource; @@ -51,8 +49,6 @@ public class HibernateConfig{ private LocalSessionFactoryBean huaWeiCloud = new LocalSessionFactoryBean(); - private MyEmptyInterceptor interceptor =new MyEmptyInterceptor(); - private DruidDataSource dataSource(String url,String username,String password){ DruidDataSource dataSource=new DruidDataSource(); dataSource.setUrl(url); @@ -78,7 +74,6 @@ public class HibernateConfig{ bean.setHibernateProperties(properties); bean.setDataSource(dataSource); bean.setPackagesToScan(packagesToScan); - bean.setEntityInterceptor(interceptor); try { bean.afterPropertiesSet(); } catch (IOException e) { diff --git a/db/src/main/java/db/config/MyEmptyInterceptor.java b/db/src/main/java/db/config/MyEmptyInterceptor.java deleted file mode 100644 index 76f522c..0000000 --- a/db/src/main/java/db/config/MyEmptyInterceptor.java +++ /dev/null @@ -1,30 +0,0 @@ -package db.config; - - -import db.model.DataModel; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.hibernate.EmptyInterceptor; -import org.hibernate.type.Type; - - -import java.io.Serializable; - -public class MyEmptyInterceptor extends EmptyInterceptor { - private Logger log=LogManager.getLogger(); - - @Override - public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { - if(entity instanceof DataModel){ - DataModel dataModel= (DataModel) entity; - log.info(dataModel); - } - return true; - } - - @Override - public String onPrepareStatement(String sql) { -// log.info(sql); - return super.onPrepareStatement(sql); - } -} diff --git a/web/src/main/java/web/config/SpringConfig.java b/web/src/main/java/web/config/SpringConfig.java index e55490c..76dfc54 100644 --- a/web/src/main/java/web/config/SpringConfig.java +++ b/web/src/main/java/web/config/SpringConfig.java @@ -3,7 +3,6 @@ package web.config; import core.dao.BaseDao1; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.context.annotation.PropertySource; import org.springframework.orm.hibernate5.support.OpenSessionInViewInterceptor; import org.springframework.web.servlet.config.annotation.EnableWebMvc; @@ -19,7 +18,7 @@ import javax.annotation.Resource; @Configuration @EnableWebMvc @PropertySource("classpath:config.properties") -@ComponentScan({"web.controller"}) +@ComponentScan({"web.controller","web.service"}) public class SpringConfig implements WebMvcConfigurer { diff --git a/web/src/main/java/web/controller/BaseController.java b/web/src/main/java/web/controller/BaseController.java index 63e9211..fd04444 100644 --- a/web/src/main/java/web/controller/BaseController.java +++ b/web/src/main/java/web/controller/BaseController.java @@ -18,7 +18,7 @@ public class BaseController{ protected Logger log=LogManager.getLogger(); @Resource - protected BaseService baseService; + public BaseService baseService; @ResponseBody @RequestMapping(value = "{action}", produces = "application/json;charset=UTF-8") diff --git a/web/src/main/java/web/controller/DataController.java b/web/src/main/java/web/controller/DataController.java new file mode 100644 index 0000000..68f7298 --- /dev/null +++ b/web/src/main/java/web/controller/DataController.java @@ -0,0 +1,28 @@ +package web.controller; + +import db.model.DataModel; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import web.service.DataService; + +import javax.annotation.Resource; + +@Controller +@RequestMapping("/data") +public class DataController extends BaseController { + + @Resource + private DataService dataService; + + @RequestMapping("start/{size}") + public void start(@PathVariable Integer size){ + stop(); + dataService.start(size); + } + + @RequestMapping("stop") + public void stop(){ + dataService.stop(); + } +} diff --git a/web/src/main/java/web/service/DataService.java b/web/src/main/java/web/service/DataService.java new file mode 100644 index 0000000..37252ff --- /dev/null +++ b/web/src/main/java/web/service/DataService.java @@ -0,0 +1,126 @@ +package web.service; + +import core.service.BaseService; +import db.model.CidEntity; +import db.model.DataModel; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.hibernate.Session; +import org.hibernate.query.NativeQuery; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.stereotype.Service; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Future; + +@Service +public class DataService extends BaseService { + + private ThreadPoolTaskExecutor executor; + + private boolean isStop; + + public void start(Integer threadSize){ + isStop=false; + executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(threadSize); + executor.setMaxPoolSize(threadSize); + executor.setQueueCapacity(0); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.initialize(); + log.info("开始"); + new Thread(()->{ + getCid(threadSize); + }).start(); + } + + public void stop(){ + if(executor!=null) { + executor.shutdown(); + isStop = true; + } + } + + private void getCid(Integer threadSize) { + + + File file = new File("result"); + int i = 0; + try { + String s = FileUtils.readFileToString(file, "UTF-8"); + if (StringUtils.isNumeric(s)) { + i = Integer.parseInt(s); + } + } catch (IOException e) { + log.error(e); + } + for (; i <= 15717791; ) { + + if(isStop){ + log.info("停止"); + break; + } + + List> tasks = new ArrayList<>(); + LinkedList cid = new LinkedList<>(); + ConcurrentLinkedQueue success = new ConcurrentLinkedQueue<>(); + for (int j = 0; j < threadSize; j++) { + cid.add(i++); + } + do { + Integer c=cid.poll(); + if(c!=null) { + try { + executor.execute(() -> { + save(c); + success.add(c); + }); + } catch (Exception e) { + cid.add(c); + } + } + } while (success.size() < threadSize); + tasks.clear(); + cid.clear(); + success.clear(); + try { + FileUtils.writeStringToFile(file, i + "", "UTF-8", false); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + + private void save(Integer id) { + try { + DataModel dataModel = baseDao1.get(DataModel.class, id); + CidEntity cidEntity = baseDao1.get(CidEntity.class, id); + + if (dataModel != null && cidEntity != null && cidEntity.getTypeid() != null) { + dataModel.setTypeId(cidEntity.getTypeid()); + baseDao2.executeWithNativeSession((Session session) -> { + session.beginTransaction(); + int i = 1; + String sql = "insert into data_" + cidEntity.getTypeid() + " (aid, author, backup_vid, cache, cover, dispatch, dispatch_servers, dp_done, dp_done_flv, dp_done_hdmp4, dp_done_mp4, duration, files, letv_addr, letv_vid, letv_vu, mid, page, storage, storage_server, subtitle, title, type, type_id, upload, upload_meta, vid, vp, cid) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + NativeQuery query = session.createNativeQuery(sql) + .setParameter(i++, dataModel.getAid()).setParameter(i++, dataModel.getAuthor()).setParameter(i++, dataModel.getBackupVid()).setParameter(i++, dataModel.getCache()).setParameter(i++, dataModel.getCover()) + .setParameter(i++, dataModel.getDispatch()).setParameter(i++, dataModel.getDispatchServers()).setParameter(i++, dataModel.getDpDone()).setParameter(i++, dataModel.getDpDoneFlv()).setParameter(i++, dataModel.getDpDoneHdmp4()).setParameter(i++, dataModel.getDpDoneMp4()) + .setParameter(i++, dataModel.getDuration()).setParameter(i++, dataModel.getFiles()).setParameter(i++, dataModel.getLetvAddr()).setParameter(i++, dataModel.getLetvVid()).setParameter(i++, dataModel.getLetvVu()).setParameter(i++, dataModel.getMid()) + .setParameter(i++, dataModel.getPage()).setParameter(i++, dataModel.getStorage()).setParameter(i++, dataModel.getStorageServer()).setParameter(i++, dataModel.getSubtitle()).setParameter(i++, dataModel.getTitle()).setParameter(i++, dataModel.getType()) + .setParameter(i++, dataModel.getTypeId()).setParameter(i++, dataModel.getUpload()).setParameter(i++, dataModel.getUploadMeta()).setParameter(i++, dataModel.getVid()).setParameter(i++, dataModel.getVp()).setParameter(i++, dataModel.getCid()); + return query.executeUpdate(); + }); + + } + }catch (Exception e){ + log.error(e); + } + + } +} diff --git a/web/src/test/java/SpringTest.java b/web/src/test/java/SpringTest.java index 45c336d..d9616d5 100644 --- a/web/src/test/java/SpringTest.java +++ b/web/src/test/java/SpringTest.java @@ -1,8 +1,6 @@ import core.dao.BaseDao1; -import core.dao.BaseDao2; import db.model.CidEntity; import db.model.DataModel; -import db.model.TaskEntity; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; @@ -13,18 +11,13 @@ import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Projections; -import org.hibernate.metamodel.internal.MetamodelImpl; import org.hibernate.service.ServiceRegistry; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.schema.TargetType; -import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.dao.DataAccessException; -import org.springframework.test.annotation.Rollback; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.web.SpringJUnitWebConfig; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.transaction.annotation.Transactional; import web.config.AppConfig; import javax.annotation.Resource; @@ -39,53 +32,14 @@ import java.util.List; @SpringJUnitWebConfig @ContextConfiguration(classes = {AppConfig.class}) public class SpringTest { - private Logger log=LogManager.getLogger(); + private Logger log = LogManager.getLogger(); @Resource private BaseDao1 baseDao1; - @Resource - private BaseDao2 baseDao2; - - @Test - public void factory(){ - MetamodelImpl metamodel= (MetamodelImpl) baseDao1.getSessionFactory().getMetamodel(); - } - - @Test - @Transactional("transactionManager2") - @Rollback(false) - public void test1(){ - DataModel dataModel=new DataModel(); - dataModel.setCid(333); - TaskEntity taskEntity=new TaskEntity(); - taskEntity.setApi("fdsfsdf"); - baseDao2.save(dataModel); - } - - @Test - @Transactional("transactionManager2") - @Rollback(false) - public void test(){ -// for (int id=1;id<10;id++){ - int id=103; - DataModel dataModel=baseDao1.get(DataModel.class,id); - CidEntity cidEntity=baseDao1.get(CidEntity.class,id); - if(dataModel!=null&&cidEntity!=null){ - dataModel.setTypeId(cidEntity.getTypeid()); - try { - log.info(baseDao2.save(dataModel)); - }catch (DataAccessException e){ - log.error(e); - } - } - -// } - } - -// @Test - public void exportTableSql(){ + // @Test + public void exportTableSql() { ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(baseDao1.getSessionFactory().getProperties()).build(); Metadata metadata = new MetadataSources(serviceRegistry).addAnnotatedClass(DataModel.class).buildMetadata(); SchemaExport schemaExport = new SchemaExport(); @@ -94,67 +48,67 @@ public class SpringTest { schemaExport.create(EnumSet.of(TargetType.SCRIPT), metadata); - List typeid= (List) baseDao1.findByCriteria(DetachedCriteria.forClass(CidEntity.class).setProjection(Projections.groupProperty("typeid"))); + List typeid = (List) baseDao1.findByCriteria(DetachedCriteria.forClass(CidEntity.class).setProjection(Projections.groupProperty("typeid"))); - List tableNames=new ArrayList<>(); - StringBuffer sb=new StringBuffer(); - for(Integer id:typeid){ - String tableName="data_"+id; - sb.append("create table "+tableName+" like data_1;\n"); - tableNames.add(tableName); - } + List tableNames = new ArrayList<>(); + StringBuffer sb = new StringBuffer(); + for (Integer id : typeid) { + String tableName = "data_" + id; + sb.append("create table " + tableName + " like data_1;\n"); + tableNames.add(tableName); + } - sb.append("create table data (\n" + - " cid integer not null,\n" + - " aid integer,\n" + - " author varchar(255),\n" + - " backup_vid varchar(255),\n" + - " cache varchar(255),\n" + - " cover varchar(255),\n" + - " dispatch integer,\n" + - " dispatch_servers integer,\n" + - " dp_done tinyint,\n" + - " dp_done_flv tinyint,\n" + - " dp_done_hdmp4 tinyint,\n" + - " dp_done_mp4 tinyint,\n" + - " duration double precision,\n" + - " files integer,\n" + - " letv_addr varchar(255),\n" + - " letv_vid integer,\n" + - " letv_vu varchar(255),\n" + - " mid integer,\n" + - " page integer,\n" + - " storage integer,\n" + - " storage_server integer,\n" + - " subtitle varchar(255),\n" + - " title varchar(255),\n" + - " type varchar(255),\n" + - " upload integer,\n" + - " upload_meta integer,\n" + - " vid varchar(255),\n" + - " vp integer,\n" + - " type_id integer,\n" + - " primary key (cid)\n" + - " ) engine=MERGE UNION=("+StringUtils.join(tableNames,",")+") insert_method=no;"); + sb.append("create table data (\n" + + " cid integer not null,\n" + + " aid integer,\n" + + " author varchar(255),\n" + + " backup_vid varchar(255),\n" + + " cache varchar(255),\n" + + " cover varchar(255),\n" + + " dispatch integer,\n" + + " dispatch_servers integer,\n" + + " dp_done tinyint,\n" + + " dp_done_flv tinyint,\n" + + " dp_done_hdmp4 tinyint,\n" + + " dp_done_mp4 tinyint,\n" + + " duration double precision,\n" + + " files integer,\n" + + " letv_addr varchar(255),\n" + + " letv_vid integer,\n" + + " letv_vu varchar(255),\n" + + " mid integer,\n" + + " page integer,\n" + + " storage integer,\n" + + " storage_server integer,\n" + + " subtitle varchar(255),\n" + + " title varchar(255),\n" + + " type varchar(255),\n" + + " upload integer,\n" + + " upload_meta integer,\n" + + " vid varchar(255),\n" + + " vp integer,\n" + + " type_id integer,\n" + + " primary key (cid)\n" + + " ) engine=MERGE UNION=(" + StringUtils.join(tableNames, ",") + ") insert_method=no;"); try { - FileUtils.writeStringToFile(new File("test.sql"),sb.toString(),"utf-8",true); + FileUtils.writeStringToFile(new File("test.sql"), sb.toString(), "utf-8", true); } catch (IOException e) { e.printStackTrace(); } } - @Test +// @Test public void test4() throws IOException { - DetachedCriteria criteria=DetachedCriteria.forClass(DataModel.class); - List dataEntities= (List) baseDao1.findByCriteria(criteria,10,10); - for(DataModel dataEntity:dataEntities){ + DetachedCriteria criteria = DetachedCriteria.forClass(DataModel.class); + List dataEntities = (List) baseDao1.findByCriteria(criteria, 10, 10); + for (DataModel dataEntity : dataEntities) { log.info(dataEntity.getCid()); } // 查询总条数 - Long count=baseDao1.executeWithNativeSession((Session session)-> (Long) DetachedCriteria.forClass(DataModel.class).setProjection(Projections.rowCount()).setProjection(Projections.groupProperty("groupId")).getExecutableCriteria(session).uniqueResult()); - + Long count = baseDao1.executeWithNativeSession((Session session) -> (Long) DetachedCriteria.forClass(DataModel.class).setProjection(Projections.rowCount()).setProjection(Projections.groupProperty("groupId")).getExecutableCriteria(session).uniqueResult()); + } }