回盲部憩室是什么意思| 水泊梁山什么意思| 头顶头发稀少是什么原因| 乙肝五项15阳性是什么意思| 粘假牙用什么胶| 脚趾头抽筋是什么原因引起的| 三点水加亘念什么| 什么东西清肺最好| jasonwood是什么牌子| 肌肉的作用是什么| 人为什么会过敏| 兔和什么生肖最配| 冬天怕冷夏天怕热是什么原因| 脚老抽筋是什么原因| 遗精是什么原因引起的| 鸡眼用什么药好| 血脂高有什么症状表现| 送女朋友什么礼物| 痛风看什么科| 大海是什么颜色| 什么是素质| 螺旋杆菌阳性是什么病| 甲硝唑有什么副作用| 坐卧针毡是什么生肖| 浪子是什么意思| 灶性肠化是什么意思| 多吃黑豆有什么好处| C反应蛋白高是什么原因| 言字旁可念什么| 什么是核素| 抗糖是什么意思| 居酒屋是什么意思| 宝宝干咳嗽是什么原因| 蛐蛐吃什么| 豆浆什么时候喝最好| 眼睛酸疼是什么原因| 有什么办法让男人死精| 寸关尺代表什么器官| 张扬是什么意思| 气管炎不能吃什么食物| hpv6阳性是什么意思| 反酸吃什么药| 孩子感冒咳嗽吃什么药| 抗美援朝什么时候结束| 属牛的五行属性是什么| 上不下大是什么字| 内能是什么| 分别心是什么意思| 肚子里有虫子会有什么症状| 平衡液又叫什么名字| 黄金茶属于什么茶| 胃烂了是什么病严重吗| 眼睛发炎吃什么消炎药| 头顶头发稀少是什么原因| 靳东妹妹叫什么名字| igm是什么| 是什么星座| 天麻长什么样子图片| 回是什么生肖| 红烧肉可以放什么配菜| 上颚痒是什么原因| 做梦梦见生孩子是什么意思| 山竹什么人不能吃| 3p 什么意思| 突然不硬是什么原因| 秋天穿什么衣服| hpv感染是什么| 火高念什么| 尿糖阴性什么意思| 什么牌子的山地车好骑又不贵| 乌鸡煲汤放什么材料| 大同有什么好玩的地方| 经济危机是什么意思| 女人什么时候最想要| 什么是原发性高血压和继发性高血压| 天相是什么意思| 龙虾吃什么| 哀转久绝的绝什么意思| 梦见红棺材是什么征兆| 变色龙形容什么样的人| 高血压2级是什么意思| 婴儿头发长得慢是什么原因| 可刀是什么意思| 丰都为什么叫鬼城| 戒色是什么意思| 退役是什么意思| 平反是什么意思| lv是什么意思| 小鹦鹉吃什么食物| 什么终于什么造句| 尖锐湿疣是什么样的| 韩世忠为什么不救岳飞| 太行山在什么地方| 什么是友谊| 佃农是什么意思| 双氧水是什么东西| 猴戏是什么意思| 渐冻症是什么| 病毒感染发烧吃什么药| 水漂是什么意思| 京酱肉丝是什么菜系| 周到是什么意思| 口水臭什么原因| 汽车五行属什么| m是什么码| 红茶适合什么季节喝| 马蹄铁什么时候发明的| 身体虚弱打什么营养针| 骨蒸潮热 是什么意思| 打狂犬疫苗不能吃什么| 为什么会长结石| 什么眼霜去眼袋效果好| 金先读什么| 小缺血灶是什么意思| 做梦被杀了是什么征兆| 惊弓之鸟什么意思| pornhub是什么| 两个人在一起的意义是什么| 破釜沉舟是什么意思| 秋季养胃吃什么好| 细胞是由什么构成的| 砂舞是什么意思| 靖国神社是什么| 珍珠婚是什么意思| 伪娘是什么| 梦到和死人说话是什么意思| 宫腔镜手术是什么原因才要做| 蒂芙尼算什么档次| 大便干吃什么药| 臭宝是什么意思| 语五行属什么| 肝脏看什么科室| 姑爹是什么意思| 为什么会得子宫肌瘤| 脸浮肿是什么原因| 林俊杰什么时候出道的| 背部爱出汗是什么原因| 微笑表情代表什么意思| 做梦梦见鬼是什么预兆| 必迈跑鞋什么档次| 生辉是什么意思| 表示什么意思| 致意是什么意思| 感冒拉肚子吃什么药| 什么也别说| 红豆和什么一起煮比较好| 腰疼吃什么药效果好| 520送男朋友什么礼物| 记忆力不好吃什么| 立秋什么时候| 88是什么意思| 眼角长脂肪粒是什么原因| 世家是什么意思| 当我们谈论爱情时我们在谈论什么| 2007年属猪五行属什么| ysl是什么牌子| 脾大是什么病| 麦冬是什么植物| 身旺是什么意思| 制片人是干什么的| 什么是智齿牙| 老年人嘴唇发紫是什么原因| lbl是什么意思| 3月20日什么星座| 长长的什么| 梦见和死去的亲人说话是什么意思| 念旧的人是什么样的人| 股票里xd是什么意思| o型血和b型血生的孩子是什么血型| 高危行为是什么意思| 拉出黑色的屎是什么原因| 为什么会心肌缺血| 竖中指是什么意思| 心机女是什么意思| 老年人缺钾吃什么好| 孩子吃什么有助于长高| 取环什么时候取最好| 首长是什么意思| 化胡为佛是什么意思| 胃痉挛吃什么药最有效| 红鸾星动是什么意思| 六月份适合种什么菜| 喉咙痛可以吃什么水果| ro什么意思| 1992属什么生肖| 原发性肝ca什么意思| 1908年中国发生了什么| 山竹里面黄黄的是什么可以吃吗| 嗳气和打嗝有什么区别| 检查骨密度挂什么科| 什么是豆粕| 内痔疮有什么症状| 什么是飞秒手术| 外阴白斑用什么药最好| 离婚证是什么颜色| 风热感冒用什么药好| upc码是什么意思| 刘禅属什么生肖| 笑面虎什么意思| 脚气用什么药| 尿道感染应该吃什么药| female什么意思| hb什么意思| 圣贤是什么意思| 神经痛什么原因引起的| 曹仁和曹操什么关系| 丑时是什么时辰| 风湿吃什么药好| 四面八方指什么生肖| 人是由什么组成的| 白狗子是什么意思| 乙肝235阳性是什么意思| 什么叫有格局的人| au750是什么材质| 头发变黄是什么原因| 宫腔积液吃什么药效果最好| 排卵期是什么意思| 晚上睡觉多梦是什么原因| 6d是什么意思| 脚板肿是什么原因引起的| 怀孕周期是从什么时候开始算的| 经期能吃什么水果| 做爱女生是什么感觉| 煲蛇汤放什么材料好| 阑尾炎手术后吃什么好| 马蜂蛰了用什么药| 加盟店是什么意思| 龙和什么属相相克| 淋巴细胞比率偏高是什么原因| 6.5是什么星座| 籽字五行属什么| 嬲什么意思| 水能变成什么| 风景旧曾谙是什么意思| 血脂高是什么原因| 什么是m属性| 四月18号是什么星座的| 初恋是什么意思| 病毒性感冒什么症状| 瞎子吃核桃砸了手是什么生肖| 肝有钙化灶是什么意思| 免疫力低下吃什么| zara是什么意思| 真实是什么意思| gold是什么牌子| 阿碧的居所叫什么名字| 手指上的月牙代表什么| 心安是什么意思| 梦见已故的父母是什么兆头| 自闭什么意思| 增值税是什么| 女性腹部彩超检查什么| 解脲脲原体阳性是什么病| 阴道干燥是什么原因| 咳嗽吃什么好的快| 骨挫伤是什么意思| 消谷善饥是什么意思| 包公是什么意思| 什么在千里| 3.8号是什么星座| 猫咪打呼噜代表什么| 肠炎发烧吃什么药| 下午14点是什么时辰| 热感冒有什么症状| 百度

中国国际农业信息化与智能装备展于12月18-19日

开发 前端
如果你还在为批处理任务头疼,不妨试试 Spring Batch。相信我,学会它之后,你会发现批处理原来可以这么简单、这么高效!
百度 两驱舒适版官方指导价:万元虽然售价比风尚版高了万元,但增加的配置了,遗憾的是中控屏幕只有英寸并且不支持CarPlay功能,但是对于提升车内高级氛围还是很有帮助的,可以还没有配置天窗,如果对于天窗不是很在意的朋友,买这款就挺合适的。

兄弟们,有没有遇到过这种情况:每个月最后一天都要手动执行几十条 SQL 清理过期数据,结果因为忘记加 LIMIT 导致数据库锁表,被 DBA 追着打?或者为了生成一份报表,不得不写个 for 循环从数据库查数据,结果因为内存溢出把服务器干挂了?

这就是传统批处理的「坑爹日常」—— 手动操作易出错、代码重复率高、性能还拉胯。但别急,Spring Batch 就是来拯救你的!这个 Spring 亲儿子框架,能让你用写业务代码的时间,搞定原本需要加班三天的批量任务,效率直接飙升 500%。

一、传统批处理的三大「坑王之王」

在正式发车前,咱们先聊聊传统批处理的「三大罪状」,看看你有没有中过招:

1. 手动操作:程序员的「反人类设计」

想象一下,你要删除数据库里 100 万条过期订单数据。传统做法是写个循环,每次删 5000 条:

DELETE FROM active_orders 
WHERE create_time < '2025-08-08'
LIMIT 5000;

然后手动执行几十次,直到没数据为止。这要是漏执行一次,第二天就得面对产品经理的「亲切问候」。

2. 多线程:程序员的「噩梦工厂」

为了提升性能,你可能会用多线程处理数据。但写出来的代码往往像这样:

ExecutorService executor = Executors.newFixedThreadPool(8);
while (hasNextPage()) {
    List<Data> page = fetchNextPage();
    executor.submit(() -> processPage(page));
}
// 忘记调用 shutdown(),线程池直接爆炸!

结果就是内存泄漏、数据库连接泄露,服务器分分钟变成「烤鸡」。

3. 配置管理:程序员的「智商检测器」

参数写死在代码里,改个批量大小就得重新打包部署;不同环境配置混杂,测试环境跑好好的,一到生产就报错。这时候你只能对着屏幕大喊:「这锅我不背!」

二、Spring Batch:批处理界的「瑞士军刀」

Spring Batch 就像程序员的「智能管家」,帮你搞定所有脏活累活。它的核心优势可以用三个词概括:自动化、健壮性、可扩展性。

1. 自动化流水线:数据处理「一键三连」

Spring Batch 把批处理抽象成「读取 → 处理 → 写入」的流水线。比如处理 CSV 文件,你只需要配置好 ItemReader(读文件)、ItemProcessor(数据清洗)、ItemWriter(写入数据库),剩下的交给框架自动完成。

2. 健壮性拉满:妈妈再也不用担心我的代码

  • 事务管理:每个批次(Chunk)作为一个事务,失败自动回滚,成功才提交。
  • 错误处理:支持重试(Retry)和跳过(Skip)机制。比如某条数据格式错误,跳过它继续处理下一条,而不是整个任务崩溃。
  • 断点续传:任务执行到一半失败?重启后自动从断点继续,不用从头再来。

3. 性能飙升:从「蜗牛」到「火箭」

Spring Batch 内置了多种优化策略:

  • 批量读取:使用游标(Cursor)一次性读取大量数据,减少数据库交互次数。
  • 异步处理:将数据处理和写入放到线程池异步执行,CPU 利用率直接翻倍。
  • 分区处理:把大数据集拆分成多个小任务并行处理,百万级数据分分钟搞定。

三、Spring Batch 核心组件:四大金刚「组队打怪」

Spring Batch 的核心组件可以比作一个「工厂」:

  • Job(厂长):负责统筹全局,安排任务流程。
  • Step(车间主任):具体执行任务的单元,每个 Step 包含完整的「读取 → 处理 → 写入」流程。
  • ItemReader(搬运工):从数据源读取数据,支持文件、数据库、消息队列等多种来源。
  • ItemProcessor(质检员):对数据进行清洗、转换等处理。
  • ItemWriter(打包工):将处理后的数据写入目标存储。

1. Job:任务指挥官

Job 是批处理的顶级抽象,一个 Job 可以包含多个 Step。比如银行的日终对账 Job,可能包含下载文件、数据校验、生成报表三个 Step:

@Bean
public Job dailyReconciliationJob(JobBuilderFactory jobBuilderFactory, Step downloadStep, Step validateStep) {
    return jobBuilderFactory.get("dailyReconciliation")
        .start(downloadStep)
        .next(validateStep)
        .build();
}

2. Step:流水线上的「螺丝钉」

Step 是 Job 的执行单元,分为两种类型:

  • Chunk-Oriented Step:基于块处理,适合数据量大的场景。
  • Tasklet Step:执行单个任务,适合简单的脚本式操作。

Chunk-Oriented Step 的核心是 chunk 方法,指定每次处理的数据量:

@Bean
public Step csvImportStep(StepBuilderFactory stepBuilderFactory, ItemReader<User> reader, ItemProcessor<User, User> processor, ItemWriter<User> writer) {
    return stepBuilderFactory.get("csvImport")
        .<User, User>chunk(100) // 每 100 条数据提交一次
        .reader(reader)
        .processor(processor)
        .writer(writer)
        .build();
}

3. ItemReader:数据搬运工

ItemReader 负责从数据源读取数据。比如读取 CSV 文件:

@Bean
public ItemReader<User> userReader() {
    FlatFileItemReader<User> reader = new FlatFileItemReader<>();
    reader.setResource(new ClassPathResource("users.csv"));
    reader.setLineMapper(new DefaultLineMapper<>() {{
        setLineTokenizer(new DelimitedLineTokenizer() {{
            setNames("name", "age", "email");
        }});
        setFieldSetMapper(new BeanWrapperFieldSetMapper<>() {{
            setTargetType(User.class);
        }});
    }});
    return reader;
}

4. ItemProcessor:数据变形金刚

ItemProcessor 对数据进行处理,比如手机号脱敏:

public class DataMaskProcessor implements ItemProcessor<User, User> {
    @Override
    public User process(User user) {
        // 手机号脱敏:138****1234
        String phone = user.getPhone();
        user.setPhone(phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
        // 邮箱转小写
        user.setEmail(user.getEmail().toLowerCase());
        return user;
    }
}

5. ItemWriter:数据收纳师

ItemWriter 将数据写入目标存储。比如批量写入数据库:

@Bean
public ItemWriter<User> userWriter(JdbcTemplate jdbcTemplate) {
    return items -> {
        for (User user : items) {
            jdbcTemplate.update(
                "INSERT INTO users (name, age, email) VALUES (?, ?, ?)",
                user.getName(),
                user.getAge(),
                user.getEmail()
            );
        }
    };
}


四、实战案例:从「Hello World」到「企业级应用」

案例 1:批量删除过期订单

传统方法需要手动循环执行 SQL,而 Spring Batch 可以这样做:

  1. 配置 Job 和 Step:
@Bean
public Job deleteExpiredOrdersJob(JobBuilderFactory jobBuilderFactory, Step deleteStep) {
    return jobBuilderFactory.get("deleteExpiredOrders")
        .start(deleteStep)
        .build();
}
@Bean
public Step deleteStep(StepBuilderFactory stepBuilderFactory, ItemReader<Order> reader, ItemWriter<Order> writer) {
    return stepBuilderFactory.get("deleteStep")
        .<Order, Order>chunk(5000)
        .reader(reader)
        .writer(writer)
        .build();
}
  • 实现 ItemReader 和 ItemWriter:
@Bean
public ItemReader<Order> orderReader(JdbcTemplate jdbcTemplate) {
    returnnew JdbcCursorItemReaderBuilder<Order>()
        .sql("SELECT id FROM orders WHERE create_time < ?")
        .parameters("2025-08-08")
        .rowMapper((rs, rowNum) -> new Order(rs.getLong("id")))
        .build();
}

@Bean
public ItemWriter<Order> orderWriter(JdbcTemplate jdbcTemplate) {
    return items -> {
        List<Long> ids = items.stream().map(Order::getId).collect(Collectors.toList());
        jdbcTemplate.update(
            "DELETE FROM orders WHERE id IN (?)",
            ids
        );
    };
}
  • 运行结果:原本需要手动执行几十次的任务,现在一键运行,效率提升 10 倍!

案例 2:日志分析系统

处理 GB 级别的 Nginx 日志,传统方法容易内存溢出,而 Spring Batch 可以这样优化:

  • 流式读取日志文件:
@Bean
public ItemReader<String> logReader() {
    return new FlatFileItemReaderBuilder<String>()
        .resource(new FileSystemResource("/var/log/nginx/access.log"))
        .lineMapper(new PassThroughLineMapper())
        .build();
}
  • 异步处理数据:
@Bean
public Step logProcessingStep(StepBuilderFactory stepBuilderFactory, ItemReader<String> reader, ItemProcessor<String, LogEntry> processor, ItemWriter<LogEntry> writer) {
    return stepBuilderFactory.get("logProcessing")
        .<String, LogEntry>chunk(1000)
        .reader(reader)
        .processor(processor)
        .writer(writer)
        .taskExecutor(new SimpleAsyncTaskExecutor())
        .throttleLimit(10) // 最大并发线程数
        .build();
}
  • 结果:处理 10GB 日志文件仅需 15 分钟,而传统方法需要 2 小时!

五、高级技巧:让 Spring Batch 「飞」起来

1. 异步处理:释放 CPU 潜能

将数据处理和写入放到线程池异步执行:

private <I, O> AsyncItemProcessor<I, O> wrapAsyncProcessor(ItemProcessor<I, O> processor, TaskExecutor taskExecutor) {
    AsyncItemProcessor<I, O> asyncProcessor = new AsyncItemProcessor<>();
    asyncProcessor.setDelegate(processor);
    asyncProcessor.setTaskExecutor(taskExecutor);
    return asyncProcessor;
}

private <O> AsyncItemWriter<O> wrapAsyncWriter(ItemWriter<O> writer) {
    AsyncItemWriter<O> asyncWriter = new AsyncItemWriter<>();
    asyncWriter.setDelegate(writer);
    return asyncWriter;
}

@Bean
public Step asyncStep(StepBuilderFactory stepBuilderFactory, ItemReader<PayOrderPo> reader, ItemProcessor<PayOrderPo, PayOrderPo> processor, ItemWriter<PayOrderPo> writer) {
    AsyncItemProcessor<PayOrderPo, PayOrderPo> asyncProcessor = wrapAsyncProcessor(processor, new ThreadPoolTaskExecutor());
    AsyncItemWriter<PayOrderPo> asyncWriter = wrapAsyncWriter(writer);
    return stepBuilderFactory.get("asyncStep")
        .<PayOrderPo, Future<PayOrderPo>>chunk(500)
        .reader(reader)
        .processor(asyncProcessor)
        .writer(asyncWriter)
        .build();
}

2. 分区处理:大数据量「分而治之」

将数据按时间范围分区,并行处理:

@Bean
public Job partitionJob(JobBuilderFactory jobBuilderFactory, Step partitionStep) {
    return jobBuilderFactory.get("partitionJob")
        .start(partitionStep)
        .build();
}

@Bean
public Step partitionStep(StepBuilderFactory stepBuilderFactory, Step slaveStep) {
    return stepBuilderFactory.get("partitionStep")
        .partitioner("slaveStep", new RangePartitioner<>("id", 0, 1000000, 10))
        .step(slaveStep)
        .gridSize(10) // 并发分区数
        .build();
}

@Bean
public Step slaveStep(StepBuilderFactory stepBuilderFactory, ItemReader<Order> reader, ItemWriter<Order> writer) {
    return stepBuilderFactory.get("slaveStep")
        .<Order, Order>chunk(1000)
        .reader(reader)
        .writer(writer)
        .build();
}

3. 监控与调优:让问题「无所遁形」

  • 使用 Spring Boot Actuator:
management:
  endpoints:
    web:
      exposure:
        include: "batch-jobs"

访问 /actuator/batch-jobs 可以查看作业状态、执行历史等信息。

  • 性能调优参数:
spring.batch.job:
  parameters:
    chunk-size: 1000 # 每批次处理 1000 条数据
    thread-pool-size: 8 # 线程池大小
    max-retries: 3 # 最大重试次数


六、效率飙升 500% 的秘密:Spring Batch vs 传统方法

对比项

传统方法

Spring Batch

开发效率

从头编写重复代码,开发周期长

内置组件开箱即用,开发效率提升 80%

性能

单线程处理,性能低下

异步处理 + 分区技术,吞吐量提升 5 倍

容错性

手动处理异常,容易遗漏

内置重试、跳过机制,错误处理效率提升 90%

监控与维护

无统一监控,问题排查困难

集成监控工具,实时查看作业状态

扩展性

代码耦合度高,难以扩展

模块化设计,轻松应对需求变化


七、最佳实践:写出「优雅」的批处理代码

1. 合理设置批次大小(Chunk Size)

  • 小数据量:500-1000 条 / 批次。
  • 大数据量:1000-5000 条 / 批次。
  • IO 密集型任务:适当增大批次大小,减少 IO 次数。
  • CPU 密集型任务:适当减小批次大小,避免内存溢出。

2. 避免状态共享

ItemReader、ItemProcessor、ItemWriter 应设计为无状态,确保线程安全。

3. 日志记录

在关键节点添加日志,记录处理进度和异常信息:

public class JobCompletionNotificationListener implements JobExecutionListener {
    privatefinal Logger log = LoggerFactory.getLogger(JobCompletionNotificationListener.class);

    @Override
    public void beforeJob(JobExecution jobExecution) {
        log.info("Job {} started at {}", jobExecution.getJobInstance().getJobName(), new Date());
    }

    @Override
    public void afterJob(JobExecution jobExecution) {
        if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
            log.info("Job {} completed at {} with {} items processed",
                jobExecution.getJobInstance().getJobName(),
                new Date(),
                jobExecution.getExecutionContext().getLong("totalItemsProcessed")
            );
        }
    }
}

4. 配置管理

使用 @Profile 注解区分不同环境配置:

@Configuration
@Profile("prod")
public class ProductionConfig {
    // 生产环境配置
}

@Configuration
@Profile("dev")
public class DevelopmentConfig {
    // 开发环境配置
}


八、常见问题与解决方案

1. 内存溢出(OOM)

  • 原因:一次性读取大量数据到内存。
  • 解决方案:

使用游标(Cursor)流式读取数据。

减小批次大小(Chunk Size)。

启用垃圾回收(GC)监控,优化堆内存配置。

2. 数据库连接泄露

  • 原因:未正确关闭数据库连接。
  • 解决方案:

使用 Spring 提供的 JdbcCursorItemReader,自动管理连接。

在 ItemWriter 中使用批量操作,减少连接次数。

3. 任务执行时间过长

  • 原因:数据量过大或处理逻辑复杂。
  • 解决方案:

采用分区处理,并行执行多个任务。

优化 SQL 查询,添加索引。

将耗时操作异步化,使用消息队列解耦。

九、总结:Spring Batch 是「神器」还是「玩具」?

经过实战验证,Spring Batch 绝对是企业级批处理的「神器」。它不仅能大幅提升开发效率和系统性能,还能降低维护成本和故障风险。无论是数据迁移、报表生成,还是日志分析、金融对账,Spring Batch 都能轻松应对。

如果你还在为批处理任务头疼,不妨试试 Spring Batch。相信我,学会它之后,你会发现批处理原来可以这么简单、这么高效!

责任编辑:武晓燕 来源: 石杉的架构笔记
相关推荐

2025-08-08 04:00:00

2025-08-08 11:26:47

Spring批处理重试

2025-08-08 02:00:00

2025-08-08 20:47:38

Spring框架应用程序

2025-08-08 08:01:42

SpringBatch事务管理

2025-08-08 07:28:24

2025-08-08 09:49:42

ibmdw

2025-08-08 11:00:11

大数据Hadoop数据处理

2025-08-08 09:53:34

Hadoop大数据处理

2025-08-08 15:10:55

Spring Batc框架Java

2025-08-08 14:50:15

大数据Spring Batc框架

2025-08-08 17:36:50

2025-08-08 13:05:18

2025-08-08 15:31:49

2025-08-08 09:31:17

ESLint工作原理前端

2025-08-08 10:33:36

Wi-Fi

2025-08-08 06:30:08

2025-08-08 15:47:35

JDBC批处理

2025-08-08 17:21:48

Java编程开发

2025-08-08 14:02:33

NginxHttps前端
点赞
收藏

51CTO技术栈公众号

月亮什么时候是圆的 经期适合吃什么食物 什么人容易长智齿 发量多的女生适合什么发型 m和s是什么意思
小孩流鼻血吃什么好 多囊卵巢综合症吃什么药 01年属什么生肖 瘦马什么意思 什么叫人彘
给男人补身体煲什么汤 男命七杀代表什么 总胆红素是什么 数不胜数的胜是什么意思 弱视什么意思
金木水火土代表什么 虹吸是什么意思 唇炎去医院挂什么科 肠道问题挂什么科 江西有什么特产
美团是干什么的hcv8jop6ns8r.cn 尿崩症是什么意思hcv9jop0ns3r.cn 瑞士移民需要什么条件hcv9jop1ns3r.cn 梦到刷牙什么意思cl108k.com 图灵是什么意思hcv8jop7ns2r.cn
力不到不为财是什么意思hcv9jop6ns5r.cn 澳大利亚有什么特产hcv7jop7ns4r.cn 燊是什么意思hcv8jop4ns1r.cn 骨髓移植是什么意思hcv9jop4ns2r.cn 女人排卵是什么时候hcv9jop0ns2r.cn
内膜有炎症什么症状dayuxmw.com 做彩超为什么要憋尿hcv7jop5ns0r.cn 嘴硬是什么意思hcv8jop0ns3r.cn 吃什么治便秘hcv9jop4ns6r.cn 中国信什么教bysq.com
舌炎是什么原因引起的怎样治疗bysq.com 人间炼狱是什么意思hcv8jop2ns3r.cn 副乳有什么危害吗hcv9jop4ns0r.cn 盯眝是什么意思hcv9jop8ns3r.cn 什么是有氧运动和无氧运动naasee.com
百度