spring-boot +data jpa+系统启动调优
各位程序员们,你们有没有遇到过这样一个问问题:系统在不断开发迭代的过程中,越来越慢。线上启动甚至需要5-10分钟,这个对于一个互联网项目来说时致命的打击。
大概介绍一下项目:
spring-boot+spring data jap+postgreal(l两个库)
spring-cloud-fegin接口5个
Redis数据库,
rabbitmq数据库
第一个库大概200+表
第二个大概300+表;
线上启动慢成蜗牛:时间相当于5*60;300s
针对于这个情况进行问题
最后发现系统越来越慢的原因只要是spring-jpa-data项目再启动的时候,需要对每个表进行对比检查,并且有字段会自动增减字段
优化方案:取消字段检查及更新机制
核心代码:
(1) ddl-auto: none
(2)generate-ddl: false
问题描述:
我们的项目平时并发量并不算大,但是有一天客户联系我们,说会出现交易卡死,所有交易无法进行,大约等待一分钟后会恢复的现象。后来检查日志,发现日志中有大量的等待数据库连接超时的问题
原因分析:
先写一下大致的代码结构:
├─src
└──main
└──java
└──com.example.test
└──controll
spring
Data
Jpa
+
Spring
Boot
+
Spring
Mvc
hibernate +
spring
+ struts2
hibernate +
spring
+
spring
mvc
spring
Data
Jpa
+ spirng +
spring
m...
管理员功能:
管理员信息:售票管理员和检票管理员的信息,管理员主要是增删改查有关管理员的数据信息
车辆管理:管理员进入指定功能操作区之后可以管理车辆信息,包括了售票管理员和检票管理员的信息,管理员主要是增删改查有关管理员的数据信息。
车辆调度管理:查看已发布的物流信息数据,修改物流信息,物流信息作废,即可删除。包括修改车辆的排班信息,新增车辆调度信息,根据排班信息查询车辆调度信息。
系统公告管理:管理员进入指定功能操作区之后可以管理系统公告。只有管理员才可以管理系统公告,发布公告信息,其他角色用户只能查看。
售票管理:管理员进入指定功能操作区之后可以管理售票。管理员本人也能增删改查售票信息,还可以统计各种车辆的售票信息。
Java 毕业设计,Java 课程设计,基于
Spring
Boot
+Vue 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。
包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。
该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。
项目都经过严格调试,确保可以运行!
1. 技术组成
前端:html、javascript、Vue
后台框架:
Spring
Boot
开发环境:idea
数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑)
数据库工具:navicat
部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven
2. 部署
如果部署有疑问的话,可以找我咨询
后台路径地址:localhost:8080/项目名称/admin/dist/index.html
前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)
这里是一个简单的
Spring-boot
+
Spring
-batch+hibernate+Quartz 的批量读文件写数据的例子。
首先,需要在 pom.xml 文件中添加以下依赖:
```xml
<dependency>
<groupId>org.
spring
framework.
boot
</groupId>
<artifactId>
spring-boot
-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.
spring
framework.
boot
</groupId>
<artifactId>
spring-boot
-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.
spring
framework.
boot
</groupId>
<artifactId>
spring-boot
-starter-
data
-
jpa
</artifactId>
</dependency>
在 application.yml 文件中配置数据源和 Quartz:
```yaml
spring
:
data
source:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
username: root
password: root
jpa
:
hibernate:
ddl-auto: update
show-sql: true
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: always
接下来,定义实体类 File
Data
:
```java
@Entity
@Table(name = "file_
data
")
public class File
Data
{
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "file_name")
private String fileName;
@Column(name = "line_number")
private Integer lineNumber;
@Column(name = "line_
data
")
private String line
Data
;
// getter and setter
定义读取文件的 ItemReader:
```java
@Component
@StepScope
public class FileItemReader implements ItemReader<String> {
private static final Logger LOGGER = LoggerFactory.getLogger(FileItemReader.class);
private String file;
private BufferedReader reader;
@Value("#{jobParameters['file']}")
public void setFile(String file) {
this.file = file;
@BeforeStep
public void beforeStep(StepExecution stepExecution) throws Exception {
LOGGER.info("Starting to read file: {}", file);
reader = new BufferedReader(new FileReader(file));
@Override
public String read() throws Exception {
String line = reader.readLine();
if (line != null) {
LOGGER.debug("Read line: {}", line);
} else {
LOGGER.info("Finished reading file: {}", file);
reader.close();
return line;
定义处理数据的 ItemProcessor:
```java
@Component
public class FileItemProcessor implements ItemProcessor<String, File
Data
> {
private static final Logger LOGGER = LoggerFactory.getLogger(FileItemProcessor.class);
@Override
public File
Data
process(String line) throws Exception {
LOGGER.debug("Processing line: {}", line);
String[] parts = line.split(",");
File
Data
file
Data
= new File
Data
();
file
Data
.setFileName(parts[0]);
file
Data
.setLineNumber(Integer.parseInt(parts[1]));
file
Data
.setLine
Data
(parts[2]);
return file
Data
;
定义写数据的 ItemWriter:
```java
@Component
public class FileItemWriter implements ItemWriter<File
Data
> {
private static final Logger LOGGER = LoggerFactory.getLogger(FileItemWriter.class);
@Autowired
private EntityManager entityManager;
@Override
@Transactional
public void write(List<? extends File
Data
> items) throws Exception {
LOGGER.info("Writing {} items", items.size());
for (File
Data
item : items) {
entityManager.persist(item);
entityManager.flush();
定义 Job:
```java
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Autowired
private FileItemReader fileItemReader;
@Autowired
private FileItemProcessor fileItemProcessor;
@Autowired
private FileItemWriter fileItemWriter;
@Bean
public Job fileTo
Data
baseJob() {
return jobBuilderFactory.get("fileTo
Data
baseJob")
.incrementer(new RunIdIncrementer())
.start(step1())
.build();
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.<String, File
Data
>chunk(10)
.reader(fileItemReader)
.processor(fileItemProcessor)
.writer(fileItemWriter)
.build();
定义 Quartz 定时任务:
```java
@Component
public class FileTo
Data
baseJobScheduler {
@Autowired
private SchedulerFactory schedulerFactory;
@Autowired
private JobDetail fileTo
Data
baseJobDetail;
@Autowired
private CronTriggerFactoryBean fileTo
Data
baseJobTrigger;
@PostConstruct
public void scheduleFileTo
Data
baseJob() throws SchedulerException {
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(fileTo
Data
baseJobDetail, fileTo
Data
baseJobTrigger.getObject());
scheduler.start();
最后,
启动
应用程序并将文件作为参数传递:
```java
@
Spring
Boot
Application
public class Application {
public static void main(String[] args) {
Spring
Application.run(Application.class, args);
@Bean
@StepScope
public FileItemReader fileItemReader(@Value("#{jobParameters['file']}") String file) {
FileItemReader reader = new FileItemReader();
reader.setFile(file);
return reader;
@Bean
public JobDetail fileTo
Data
baseJobDetail() {
return JobBuilder.newJob(BatchConfiguration.class)
.withIdentity("fileTo
Data
baseJob")
.storeDurably()
.build();
@Bean
public CronTriggerFactoryBean fileTo
Data
baseJobTrigger(@Autowired JobDetail fileTo
Data
baseJobDetail) {
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(fileTo
Data
baseJobDetail);
trigger.setCronExpression("0 0/1 * 1/1 * ? *"); // 每分钟执行一次
return trigger;
以上就是一个简单的
Spring-boot
+
Spring
-batch+hibernate+Quartz 的批量读文件写数据的例子。
SpringBoot2.1.3集成elasticSearch6.7.1
SpringBoot2.1.3集成elasticSearch6.7.1
SpringBoot2.1.3集成elasticSearch6.7.1
转圈圈的驴:
分布式事务解决方案
aidedmniy: