在并发项目中,使用数据库连接池
数据源,一般指javax.sql.DataSource,他可以有各种的各种不同实现,包含连接池和连接池管理,有时也直接叫他数据库连接池。
数据库连接池简介
数据库连接池在项目启动初始化时,直接创建对应的数据库连接,并将其作为对象存储在内存中。当用户访问时,不必创建新的数据库连接,而是直接使用空闲的数据库连接对象,使用完毕再将其释放,但不会断开连接。
连接池使用的优点:
资源复用
性能更优
更好的资源分配管理
统一配置,防止废连接
常用数据库连接池:
Spring框架自带的DriverManagerDataSource
阿里巴巴数据源Druid
c3p0连接池
DriverManagerDataSource
xml配置: ApplicationContext.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <!-- Connection Info --> <property name="driverClassName" value="$${jdbc.driver}" /> <property name="url" value="$${jdbc.url}" /> <property name="username" value="$${jdbc.username}" /> <property name="password" value="$${jdbc.password}" /> <!-- Connection Pooling DBCP --> <property name="initialSize" value="5" /> <property name="maxActive" value="$${jdbc.pool.maxActive}" /> <!-- 最大连接数 0为无限制 --> <property name="maxWait" value="60000" /> <!-- 最大连接等待时间 -1为无限制 --> <property name="minIdle" value="1" /> <property name="maxIdle" value="$${jdbc.pool.maxIdle}" /> <!-- 最大空闲连接数 0为无限制 --> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <property name="minEvictableIdleTimeMillis" value="300000" /> <property name="poolPreparedStatements" value="true" /> <property name="removeAbandoned" value="true" /> <!-- 回收超过5分钟的连接(秒) --> <property name="removeAbandonedTimeout" value="300" /> <!-- 防止 mysql 超时 --> <property name="validationQuery" value="SELECT 1" /> <property name="testWhileIdle" value="true" /> <property name="testOnBorrow" value="false" /> <property name="testOnReturn" value="false" /> <property name="logAbandoned" value="true" /> </bean>
.properties略
c3p0连接池
配置文件c3p0-config.xml
<c3p0-config> <default-config> <property name="automaticTestTable">con_test</property> <property name="checkoutTimeout">30000</property> <property name="idleConnectionTestPeriod">30</property> <property name="initialPoolSize">10</property> <!-- 超过多长时间连接自动销毁,默认为0,即永远不会自动销毁 --> <property name="maxIdleTime">30</property> <property name="maxPoolSize">100</property> <property name="minPoolSize">10</property> <property name="maxStatements">200</property> <user-overrides user="test-user"> <property name="maxPoolSize">10</property> <property name="minPoolSize">1</property> <property name="maxStatements">0</property> </user-overrides> </default-config> <!-- This app is massive! --> <named-config name="intergalactoApp"> <!-- 声明当连接池中连接耗尽时再一次新生成多少个连接,默认为3个 --> <property name="acquireIncrement">50</property> <!--当连接池启动时,初始化连接的个数,必须在minPoolSize~maxPoolSize之间,默认为3 --> <property name="initialPoolSize">100</property> <!-- 任何时间连接池中保存的最小连接数,默认3 --> <property name="minPoolSize">50</property> <!-- 在任何时间连接池中所能拥有的最大连接数,默认15 --> <property name="maxPoolSize">1000</property> <!-- intergalactoApp adopts a different approach to configuring statement caching --> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property> <user-overrides user="master-of-the-universe"> <property name="acquireIncrement">1</property> <property name="initialPoolSize">1</property> <property name="minPoolSize">1</property> <property name="maxPoolSize">5</property> <property name="maxStatementsPerConnection">50</property> </user-overrides> </named-config> </c3p0-config>
相关参数的选择
配置连接池时,应合理配置相关参数。
maxActive:最大活动连接,一般等于应用并发量。