繁体   English   中英

Springboot JPA Repository 未释放 Hikari DB Connection

[英]Springboot JPA Repository not releasing Hikari DB Connection

我在 Springboot 中有一个 rest API 使用 Hikari 进行连接池。 Hikari 与默认配置一起使用(池中有 10 个连接,等待连接超时 30 秒)。 API本身就很简单

  1. 它首先进行 JPA 存储库查询以从 PostgresDB 获取一些数据。 这部分大约需要 15-20 毫秒。
  2. 然后,它将这些数据发送到远程 REST API,速度很慢,可能需要 120 秒以上。
  3. 一旦远程 API 响应,我的 API 将结果返回给客户端。 简化版本如下所示。
    public ResponseEntity analyseData(int companyId) {
        Company company = companyRepository.findById(companyId);//takes 20ms
        Analysis analysis = callRemoteRestAPI(company.data) //takes 120seconds
       return ResponseEntity.status(200).body(analysis);

    }

该代码没有任何 @Transactional 注释。 我发现 JDBC 连接在我的 API 的整个持续时间内(即约 120 秒)都保持不变。 因此,如果我们收到超过 10 个请求,它们会超时等待 hikari 连接池(30 秒)。 但严格来说,我的 API 在 JPA 查询完成后不需要连接(上面的第 1 步)。

有没有办法让 spring 在查询后立即释放此连接,而不是保持它直到整个 API 完成处理? 可以将 Spring 配置为获得每个 JPA 请求的连接吗? 这样,如果我有多个 JPA 查询,其中散布着非常慢的操作,则服务器吞吐量不会受到影响,并且它可以处理超过 10 个并发 API 请求。 .

Essentially the problem is caused by the Spring OpenSessionInViewFilter that " binds a Hibernate Session to the thread for the entire processing of the request " This essentially acquires a connection from the pool when the first JPA query is executed and then holds on to it till the request被处理。

此页面 - https://www.baeldung.com/spring-open-session-in-view提供了有关此功能的清晰简洁的说明。 它有其优点和缺点,目前的意见似乎对它的使用存在分歧。

列表中的 findBy 属性<object> SpringBoot JPA 存储库<div id="text_translate"><p>我的数据库 Story 和 Tag 中的两个对象之间存在一对多关系。</p><p> 我希望能够获取所有带有标签 object 和字符串名称的 Story 对象。</p><p> 故事.java</p><pre> @Entity @Table(name = "stories") public class Story { @Id @GeneratedValue private Long id; @Column(name = "title") private String title; @JsonIgnoreProperties({"story"}) @OneToMany(mappedBy = "story", fetch = FetchType.LAZY) private List&lt;Tag&gt; tags; public Story(String title){ this.title = title; } public Story(){ } // getters &amp; setters }</pre><p> 标签.java</p><pre> @Entity @Table(name = "tags") public class Tag { @Id @GeneratedValue private Long id; @Column(name = "name") private String name; @JsonIgnoreProperties({"tags"}) @ManyToOne @JoinColumn(name = "story_id", nullable = false) @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) private Story story; public Tag(String name, Story story){ this.name = name; this.story = story; } public Tag(){ } /// getters &amp; setters }</pre><p> StoryController.java</p><pre> @RestController public class StoryController { @Autowired StoryRepository storyRepository; @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value = "/stories") public ResponseEntity&lt;List&lt;Story&gt;&gt; getAllStories(){ return new ResponseEntity&lt;&gt;(storyRepository.findAll(), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/tagSearch/{name}") public ResponseEntity&lt;Story&gt; getStoryByTag(@PathVariable String name) { return new ResponseEntity(storyRepository.findByTags_Name(name), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/{id}") public ResponseEntity&lt;Story&gt; getStory(@PathVariable Long id) { return new ResponseEntity(storyRepository.findById(id), HttpStatus.OK); } }</pre><p> StoryRepository.java</p><pre> @Repository public interface StoryRepository extends JpaRepository&lt;Story, Long&gt; { public List&lt;Story&gt; findByTags_Name(String name); }</pre><p> 尝试通过浏览器查询时,转到地址 localhost:8080/api/stories/tagSearch/?name="tag" 数据库返回数据库中的所有对象,而不是我要查找的结果。</p></div></object>

[英]findBy property in List<Object> SpringBoot JPA Repository

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 JDBC - 没有可用的连接 - SpringBoot/Hikari/JPA - spring.jpa.open-in-view 尝试使用Spring / JPA / Hikari在我的代码中查找数据库连接泄漏 Hikari DB连接最大池了解和调整 Hikari CP DB 连接未在异步块中释放 Hikari 池连接问题避免数据库访问 SpringBoot如何为Hikari Pool和jdbcTemplate设置连接获取大小 SpringBoot 2 - 监控数据库连接 具有相同数据源的Spring JPA Hikari多个连接池 用于数据库视图(不是表)的 JPA/SpringBoot 存储库 列表中的 findBy 属性<object> SpringBoot JPA 存储库<div id="text_translate"><p>我的数据库 Story 和 Tag 中的两个对象之间存在一对多关系。</p><p> 我希望能够获取所有带有标签 object 和字符串名称的 Story 对象。</p><p> 故事.java</p><pre> @Entity @Table(name = "stories") public class Story { @Id @GeneratedValue private Long id; @Column(name = "title") private String title; @JsonIgnoreProperties({"story"}) @OneToMany(mappedBy = "story", fetch = FetchType.LAZY) private List&lt;Tag&gt; tags; public Story(String title){ this.title = title; } public Story(){ } // getters &amp; setters }</pre><p> 标签.java</p><pre> @Entity @Table(name = "tags") public class Tag { @Id @GeneratedValue private Long id; @Column(name = "name") private String name; @JsonIgnoreProperties({"tags"}) @ManyToOne @JoinColumn(name = "story_id", nullable = false) @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE) private Story story; public Tag(String name, Story story){ this.name = name; this.story = story; } public Tag(){ } /// getters &amp; setters }</pre><p> StoryController.java</p><pre> @RestController public class StoryController { @Autowired StoryRepository storyRepository; @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value = "/stories") public ResponseEntity&lt;List&lt;Story&gt;&gt; getAllStories(){ return new ResponseEntity&lt;&gt;(storyRepository.findAll(), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/tagSearch/{name}") public ResponseEntity&lt;Story&gt; getStoryByTag(@PathVariable String name) { return new ResponseEntity(storyRepository.findByTags_Name(name), HttpStatus.OK); } @CrossOrigin(origins = "http://localhost:8080/api") @GetMapping(value="/stories/{id}") public ResponseEntity&lt;Story&gt; getStory(@PathVariable Long id) { return new ResponseEntity(storyRepository.findById(id), HttpStatus.OK); } }</pre><p> StoryRepository.java</p><pre> @Repository public interface StoryRepository extends JpaRepository&lt;Story, Long&gt; { public List&lt;Story&gt; findByTags_Name(String name); }</pre><p> 尝试通过浏览器查询时,转到地址 localhost:8080/api/stories/tagSearch/?name="tag" 数据库返回数据库中的所有对象,而不是我要查找的结果。</p></div></object>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM