【问题标题】:Why does Hibernate open many ports to MySQL database?为什么 Hibernate 会为 MySQL 数据库打开许多端口?
【发布时间】:2017-06-26 00:21:00
【问题描述】:

我正在使用 Vaadin 和 Hibernate 开发 Spring Boot 应用程序,并且我在使用休眠 MySQL 时遇到问题,每次我查询数据库时,它都会打开一个到 MySQL 数据库的新端口。

当我执行netstat -ano | grep 3306 我得到这个:

  TCP    127.0.0.1:62066        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62067        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62068        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62070        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62071        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62072        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62073        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62074        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62075        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62076        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62077        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62079        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62080        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62081        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62082        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62083        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62084        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62085        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62086        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62092        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62093        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62094        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62095        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62096        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62097        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62098        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62099        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62101        127.0.0.1:3306         ESTABLISHED     10956
  TCP    127.0.0.1:62102        127.0.0.1:3306         ESTABLISHED     10956 ....... 

我能做些什么来避免这种情况?

【问题讨论】:

  • 能否提供查询示例?我的意思是打开会话的方法发出查询并关闭会话?谢谢。

标签: mysql hibernate spring-boot hibernate-criteria


【解决方案1】:

这是因为您的 ConnectionPoolManager 创建了如此多的连接,这些连接会被您的应用程序重用。多个连接允许您的应用程序以并发方式使用数据库。您可以使用hibernate.cfg.xmlpersistance.xml 将其缩小。关于如何做到这一点,您必须阅读您正在使用的ConnectionPoolManager 的文档(内置或例如C3P0

您可以尝试共享您的配置文件以获取未来帮助。

【讨论】:

  • 感谢@Antoniossss 抽出宝贵的时间,您能给我提供一个链接吗?
  • @MounirBoussetta docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… 在这里你有Springs 配置,但我不能保证这适用于你——你没有提到你当前的配置(也没有提到你正在使用弹簧;P)
【解决方案2】:

从 sn-p 我想你正确地打开和关闭了会话。 如果需要,Session 会从数据源中检索连接,因此在您完成操作后关闭它至关重要。

如果似乎打开的连接增加了,那么您就有连接泄漏。

如果您在应用程序的整个生命周期中看到稳定数量的打开连接,那么您需要检查您的数据源配置以及设置打开的连接数量。

例如,当涉及到 c3p0 数据源时 为了 cpds.setMinPoolSize(5)

无论如何,您将打开 5 个连接。

【讨论】:

  • 谢谢@gkatzioura,我会试试c3p0
  • 无需更改数据源。只需根据您当前的数据源检查您设置为强制打开的连接数即可。
  • 有没有办法在spring内置application.properties中设置连接数?
  • 是的,请检查此链接docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/… 但是不确定它是否适用于您的配置
  • 我用这个配置尝试了 c3p0 但仍然是同样的问题:@Bean public ComboPooledDataSource dataSource() { ComboPooledDataSource cpds= new ComboPooledDataSource(); cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mdb?user=root&password="); cpds.setDriverClass("com.mysql.jdbc.Driver"); cpds.setInitialPoolSize(1); cpds.setMaxPoolSize(100); cpds.setMinPoolSize(2); cpds.setCheckoutTimeout(300); cpds.setMaxStatements(50); cpds.setIdleConnectionTestPeriod(300); return cpds; }
【解决方案3】:

我找到了解决方案。问题出在 Hibernate 中,它不会自动关闭会话,为了解决这个问题,我只是设置了一个 hibernate connection release mode。对我来说,我在application.properties 中设置了这些休眠属性:

#hibernate properties
spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.properties.hibernate.transaction.auto_close_session=true
spring.jpa.properties.hibernate.connection.release_mode=after_statement

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2014-01-19
    • 2015-11-16
    相关资源
    最近更新 更多