1.简介
连接池是一种通过在池中打开和管理N个数据库连接来提高应用程序性能的技术。 该应用程序只是请求连接,使用它,然后将其放回池中。 当应用程序需要连接时,就绪连接将保持可用状态,以供池中使用。 池管理连接生命周期,因此开发人员实际上不需要等待连接建立并过滤掉过时的连接。
连接池机制节省了昂贵的操作,可以在应用程序运行时建立网络连接,并最终在后端初始化数据库会话。
2. Tomcat中的连接池实现
领先的应用程序服务器Tomcat与Commons DBCP数据源打包在一起作为默认的JNDI数据源,除非我们将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"/>
工厂是必需的, 类型应始终为javax.sql.DataSource
DBCP的优点在于,它可以与许多应用程序或框架一起使用,并且可以与市场上几乎所有数据库一起使用。
3.比较池机制
使用Commons DBCP连接池机制时 ,Tomcat会获取Commons DBCP源(该版本取决于Tomcat版本,例如Tomcat 7.0.27使用Commons DBCP 1.4),并进行软件包名称替换( org.apache.commons- > org)。 apache.tomcat.dbcp )并将结果构建为tomcat-dbcp.jar 。 这样做是为了使内部Tomcat JDBC池永远不会与Commons DBCP类的可能应用程序使用冲突。 这避免了许多潜在的类加载问题。 “ dbcp”软件包与数据源管理有关。
同样, Tomcat JDBC连接池机制(org.apache.tomcat.jdbc.pool。*)是与Apache Commons DBCP竞争的数据库连接池的替代升级实现。 它是与Tomcat分开的项目(在Tomcat模块下-> jdbc-pool),但是它在Tomcat 7中首次亮相(从2011年7月的7.0.19开始)。 两种实现都有优点和缺点,但是Apache Commons DBCP仍被更广泛地使用。
无论哪种情况,都需要将各自的JAR( commons-dbcp.jar或tomcat-jdbc.jar )包含到构建路径中。
Tomcat JDBC连接池的用法也非常简单,对于已经熟悉DBCP的人来说,过渡非常简单。
4.基于休眠的应用程序中的连接池
Hibernate使用其魔力来根据您配置的属性来标识要使用的连接池提供程序。
对于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>
相应的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配置连接池,则使用默认值。 启动应用程序时,它在日志或控制台输出中可见–
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
如果使用的是应用程序服务器,则可能希望使用内置池(通常使用JNDI获得连接)。
要使用JNDI配置将服务器的内置池与Hibernate一起使用,我们需要在Hibernate配置文件中设置以下属性–
hibernate.connection.datasource=java:/comp/env/jdbc/TestDB
–假设TestDB是Tomcat JDBC连接池数据源的JNDI名称(请参见上面第2节中的代码段)。
如果您不能或不希望使用应用程序服务器的内置连接池,则Hibernate支持其他几个连接池,例如–
- c3p0
- Proxool
在Apache DBCP之后,第二好的连接池实现是c3p0 ,它很容易与Hibernate集成,并且据说可以提供良好的性能。
5.有用的链接
如何在Hibernate中配置C3P0连接池
翻译自: https://www.javacodegeeks.com/2016/11/understanding-connection-pooling.html