使用JavaSpring和hibernate插入Oracle花费了太多时间

使用JavaSpring和hibernate插入Oracle花费了太多时间,java,spring,oracle,spring-boot,hibernate,Java,Spring,Oracle,Spring Boot,Hibernate,我有一个微服务,它从API获取一组对象,然后与远程oracle BBDD连接并插入信息。在一次通话中,我会收到7k-10k的寄存器,平均要节省1小时,这太疯狂了。为什么会这样?是服务器出了问题还是我做错了什么 application.properties文件 spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect spring.datasource.url= jdbc:oracle:thin:url spring.d

我有一个微服务,它从API获取一组对象,然后与远程oracle BBDD连接并插入信息。在一次通话中,我会收到7k-10k的寄存器,平均要节省1小时,这太疯狂了。为什么会这样?是服务器出了问题还是我做错了什么

application.properties文件

spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.datasource.url= jdbc:oracle:thin:url
spring.datasource.username=username
spring.datasource.password=password
spring.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.hibernate.ddl-auto=none
hibernate.jdbc.batch_size=50
spring.jpa.properties.hibernate.default_schema=schema
spring.jpa.show-sql=true


spring.data.rest.basePath=/api

spring.jpa.hibernate.connection.provider_class=org.hibernate.hikaricp.internal.HikariCPConnectionProvider
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=20
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.poolName=springBootJPAHikariCP
spring.datasource.hikari.maxLifetime=2000000
spring.datasource.hikari.connectionTimeout=10000

表格的模型

@Entity
@Table(name = "CALL")
public class Call {

    @Column(name = "ID")
    @Id
    private String id;

    @Column(name = "QUEUEID")
    private String queueId;

    @Column(name = "QUEUETYPE")
    private String queueType;

    @Column(name = "AGENTID")
    private String agentId;

    @Column(name = "DATASET")
    private String dataSet;

    @Column(name = "CALLDATE")
    private Timestamp callDate;

    @Column(name = "CALLDURATION")
    private String callDuration;

    @Column(name = "RINGTIME")
    private String ringTime;

    @Column(name = "RESULT")
    private String result;

    @Column(name = "DATE_LOAD")
    private Date fecCarga = new Date();

//GETTERS AND SETTERS

JAVA逻辑

逻辑很简单

 ObjectMapper objectMapper = new ObjectMapper();

        String response = reportingServices.getToken();
        Token token = objectMapper.readValue(response, Token.class);
        String tokenString = token.setToken(token.getToken());
        String startDate = req.getStartDate();
        String endDate = req.getEndDate() ;

        final String uri = API_URL 

        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(uri, String.class);

        JSONObject json = new JSONObject(result);

        JSONArray jsonArray = json.getJSONArray("list");

        try{
            for (int i = 0, size = jsonArray.length(); i < size; i++)
            {
                JSONObject objectInArray = jsonArray.getJSONObject(i);
                Call call = new Call();

                String callid = (String) objectInArray.get("callid");
                String qid = (String) objectInArray.get("qid");
                String type = (String) objectInArray.get("type");
                String agent = (String) objectInArray.get("agent");
                String dataset = (String) objectInArray.get("dataset");
                String datetime = (String) objectInArray.get("datetime");
                String duration = (String) objectInArray.get("duration");
                String ringtime = (String) objectInArray.get("ringtime");
                String resultTable = (String) objectInArray.get("result");

                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                Date parsedDate = dateFormat.parse(datetime);
                Timestamp timestamp = new java.sql.Timestamp(parsedDate.getTime());

                call.setId(callid);
                call.setQueueId(qid);
                call.setQueueType(type);
                call.setAgentId(agent);
                call.setDataSet(dataset);
                call.setCallDate(timestamp);
                call.setCallDuration(duration);
                call.setRingTime(ringtime);
                call.setResult(resultTable);
                call.setFecCarga(call.getFecCarga());

                callRepository.save(call);
            }
            return ResponseHandler.generateResponse(HttpStatus.CREATED, "Info created successfully");
        } catch (Exception e) {
            return ResponseHandler.generateResponse(HttpStatus.INTERNAL_SERVER_ERROR, "Something went wrong.");
        }

ObjectMapper ObjectMapper=new ObjectMapper();
String response=reportingServices.getToken();
Token-Token=objectMapper.readValue(响应,Token.class);
String tokenString=token.setToken(token.getToken());
字符串startDate=req.getStartDate();
字符串endDate=req.getEndDate();
最终字符串uri=API\U URL
RestTemplate RestTemplate=新RestTemplate();
String result=restemplate.getForObject(uri,String.class);
JSONObject json=新的JSONObject(结果);
JSONArray JSONArray=json.getJSONArray(“列表”);
试一试{
for(inti=0,size=jsonArray.length();i
存储库

import org.springframework.data.jpa.repository.JpaRepository;

public interface callRepository extends JpaRepository<Call,Long> {
}

import org.springframework.data.jpa.repository.JpaRepository;
公共接口调用存储库扩展了JpaRepository{
}

即使您配置了
spring.jpa.properties.hibernate.jdbc.batch\u size
它也不会帮助您,因为您要单独保存列表中的每个条目。使用JpaRepository中的
saveAll()
方法,并至少以100个为一批保存。

您是否介意共享
callRepository
?这是哪个版本的Spring Boot?我刚刚用
callRepository
更新了帖子。版本2.2.6但是如果您阅读代码,在每次迭代中都会保存一个寄存器,因为我必须遍历一个对象数组。是否可以将
saveAll()
与我实现的逻辑一起使用?是的。在for循环之前创建一个列表。在每100个条目之后,您将批量插入这些条目并清理列表,并对其他条目执行相同的操作。而
saveAll
方法将在何处?来自检查已迭代元素数的if语句的内部for循环。另一种方法是并发执行它们,甚至在那里使用批插入。也许这可以帮助你: