2017-02-08 41 views
2

我正在與Vaadin和Hibernate一起使用Spring Boot應用程序,並且我在休眠MySQL時遇到了問題,每次查詢數據庫時它都會打開一個到MySQL數據庫的新端口。爲什麼Hibernate打開許多端口到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 ....... 

我能做些什麼來避免這種情況?

+0

你能提供一個查詢的例子嗎?我的意思是打開會話的方法發出查詢並關閉會話?謝謝。 – gkatzioura

回答

2

這是因爲您的ConnectionPoolManager創建了由您的應用程序重新使用的連接數量。多個連接允許您的應用程序以併發方式使用數據庫。您可以使用hibernate.cfg.xmlpersistance.xml將其縮小。如何做到這一點,您必須閱讀您正在使用的ConnectionPoolManager文檔(內置或C3P0

您可以嘗試共享您的配置文件以備將來的幫助。

+0

非常感謝@Antoniossss您的時間,我可以向我提供我們如何做到的鏈接嗎? – MBX

+0

@MounirBoussetta http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-configure-datasource這裏你有'Spring's配置,但我不能保證這適用給你 - 你沒有提到任何關於你當前的配置(也不是說你使用彈簧; P) – Antoniossss

0

從片段我想你可以正常打開和關閉會話。 如果需要,會話將從數據源中檢索連接,因此,一旦完成操作,關閉它就顯得至關重要。

如果似乎打開的連接增加,那麼你有連接泄漏。

如果在整個應用程序的生命週期中看到穩定數量的連接,則需要檢查數據源配置以及打開多少個連接。

例如,當涉及到數據源C3P0爲 cpds.setMinPoolSize(5)

你是要去有5個連接打開不管。

+1

謝謝@gkatzioura,我會嘗試c3p0 – MBX

+0

無需更改數據源。根據您當前的數據源,只需檢查您已設置的連接數是多少。 – gkatzioura

+0

有沒有辦法在spring內置的application.properties中設置連接數? – MBX

0

我找到了解決方案。問題出現在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 
相關問題