了解连接池
1.簡介
連接池是一種通過在池中打開和管理N個數(shù)據(jù)庫連接來提高應(yīng)用程序性能的技術(shù)。 該應(yīng)用程序只是請求連接,使用它,然后將其放回池中。 當(dāng)應(yīng)用程序需要連接時,就緒連接將保持可用狀態(tài),以供池中使用。 池管理連接生命周期,因此開發(fā)人員實際上不需要等待連接建立并過濾掉過時的連接。
連接池機(jī)制節(jié)省了昂貴的操作,可以在應(yīng)用程序運行時建立網(wǎng)絡(luò)連接,并最終在后端初始化數(shù)據(jù)庫會話。
2. Tomcat中的連接池實現(xiàn)
領(lǐng)先的應(yīng)用程序服務(wù)器Tomcat與Commons DBCP數(shù)據(jù)源打包在一起作為默認(rèn)的JNDI數(shù)據(jù)源,除非我們將DataSourceFactory明確指定為–
要使用Apache Commons DBCP連接池 –
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"maxActive="100" maxIdle="30" maxWait="10000"username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/javatest" factory="org.apache.commons.dbcp.BasicDataSourceFactory"/>使用Tomcat JDBC連接池 –
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"maxActive="100" maxIdle="30" maxWait="10000"username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"url="jdbc:mysql://localhost:3306/javatest" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"/>工廠是必需的, 類型應(yīng)始終為javax.sql.DataSource
DBCP的優(yōu)點在于,它可以與許多應(yīng)用程序或框架一起使用,并且可以與市場上幾乎所有數(shù)據(jù)庫一起使用。
3.比較池機(jī)制
使用Commons DBCP連接池機(jī)制時 ,Tomcat會獲取Commons DBCP源(該版本取決于Tomcat版本,例如Tomcat 7.0.27使用Commons DBCP 1.4),并進(jìn)行軟件包名稱替換( org.apache.commons- > org)。 apache.tomcat.dbcp )并將結(jié)果構(gòu)建為tomcat-dbcp.jar 。 這樣做是為了使內(nèi)部Tomcat JDBC池永遠(yuǎn)不會與Commons DBCP類的可能應(yīng)用程序使用沖突。 這避免了許多潛在的類加載問題。 “ dbcp”軟件包與數(shù)據(jù)源管理有關(guān)。
同樣, Tomcat JDBC連接池機(jī)制(org.apache.tomcat.jdbc.pool。*)是與Apache Commons DBCP競爭的數(shù)據(jù)庫連接池的替代升級實現(xiàn)。 它是與Tomcat分開的項目(在Tomcat模塊下-> jdbc-pool),但是它在Tomcat 7中首次亮相(從2011年7月的7.0.19開始)。 兩種實現(xiàn)都有優(yōu)點和缺點,但是Apache Commons DBCP仍被更廣泛地使用。
無論哪種情況,都需要將各自的JAR( commons-dbcp.jar或tomcat-jdbc.jar )包含到構(gòu)建路徑中。
較早版本的Apache Commons DBCP(即1.2版)在高負(fù)載條件下存在一些令人討厭的線程安全問題,使其不適合這種用法,這就是重寫Tomcat JDBC連接池的原因。
Tomcat JDBC連接池的用法也非常簡單,對于已經(jīng)熟悉DBCP的人來說,過渡非常簡單。
4.基于休眠的應(yīng)用程序中的連接池
Hibernate使用其魔力來根據(jù)您配置的屬性來標(biāo)識要使用的連接池提供程序。
對于c3p0 –
<property name="hibernate.c3p0.min_size">5</property> <property name="hibernate.c3p0.max_size">20</property> <property name="hibernate.c3p0.timeout">300</property> <property name="hibernate.c3p0.max_statements">50</property> <property name="hibernate.c3p0.idle_test_period">3000</property>對于Apache Commons DBCP –
<property name="hibernate.dbcp.initialSize">8</property> <property name="hibernate.dbcp.maxActive">20</property> <property name="hibernate.dbcp.maxIdle">20</property> <property name="hibernate.dbcp.minIdle">0</property>相應(yīng)的JAR文件需要手動或使用Maven在lib目錄中。
我們也可以使用hibernate.connection.provider_class屬性明確指定連接提供者,盡管實際上并不需要它。
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property> <property name="hibernate.c3p0.min_size">1</property> <property name="hibernate.c3p0.max_size">19</property> <property name="hibernate.c3p0.timeout">120</property> <property name="hibernate.c3p0.max_statements">10</property> <property name="hibernate.c3p0.idle_test_period">3000</property>如果我們不使用Hibernate配置連接池,則使用默認(rèn)值。 啟動應(yīng)用程序時,它在日志或控制臺輸出中可見–
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureHibernate中的默認(rèn)連接池實現(xiàn)不適合生產(chǎn)使用,主要是因為它具有配置約束。
如果使用的是應(yīng)用程序服務(wù)器,則可能希望使用內(nèi)置池(通常使用JNDI獲得連接)。
要使用JNDI配置將服務(wù)器的內(nèi)置池與Hibernate一起使用,我們需要在Hibernate配置文件中設(shè)置以下屬性–
hibernate.connection.datasource=java:/comp/env/jdbc/TestDB–假設(shè)TestDB是Tomcat JDBC連接池數(shù)據(jù)源的JNDI名稱(請參見上面第2節(jié)中的代碼段)。
如果您不能或不希望使用應(yīng)用程序服務(wù)器的內(nèi)置連接池,則Hibernate支持其他幾個連接池,例如–
在Apache DBCP之后,第二好的連接池實現(xiàn)是c3p0 ,它很容易與Hibernate集成,并且據(jù)說可以提供良好的性能。
5.有用的鏈接
如何在Hibernate中配置C3P0連接池
翻譯自: https://www.javacodegeeks.com/2016/11/understanding-connection-pooling.html
總結(jié)
- 上一篇: ddos攻击有啥用(ddos以什么攻击最
- 下一篇: js 随机1-10随机数_寻找随机的错误