数据库连接池

  用池来管理Connection,这可以重复使用Connection。有了池,所有我们就不用自己来创建Connection,而是通过取来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection"归还"给池。池就可以在利用这个Connection对象了,便于管理连接,达到资源与时间的平衡。

一、连接池原理图

1、池中有,则从池中拿;

2、池中没有,就先等待,等待超时后,则新创建connection;

3、如果这个连接是原本就在池中的,那么用完之后,就放回池中;

3、如果这个连接是新创建的,那么用完之后,就直接销毁;

二、连接池的配置

1、池参数(所有池参数都有默认值):

  • 初始大小:10个;
  • 最小空闲连接数:3个;
  • 增量:一次创建的最小单位(5个);
  • 最大空闲连接数:12个;
  • 最大连接数:20个;
  • 最大的等待时间:1000毫秒。

2、四大连接参数

  连接池也是使用四大连接参数来完成创建连接对象。

3、实现的接口

连接池必须实现:javax.sql.DataSource接口。

连接池返回的Connection对象,它的close()方法与众不同,调用它的close()不是关闭,而是把连接归还给池。

三、常用连接池

(一)DBCP

1、DBCP

  DBCP(DataBase connection pool),数据库连接池。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

2、核心API:BasicDataSource、BasicDataSourceFactory

3、依赖的jar包:commons-dbcp-1.4.jar、commons-pool-1.5.6.jar、mysql-connector-java-5.1.44-bin.jar(数据库驱动,根据连接的数据库提供);

4、DBCP连接池配置文件(dbcpconfig.properties):

  配置文件需放在src的根目录下

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb1
username=root
password=

#<!-- 初始化连接 -->
initialSize=5

#最大连接数量
maxActive=50

#<!-- 超时等待时间以毫秒为单位 60000毫秒/1000等于60秒 -->
maxWait=60000

#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=utf8

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=REPEATABLE_READ

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

5、DBCP连接池示例:

 1 import org.apache.commons.dbcp.BasicDataSourceFactory;
 2 import javax.sql.DataSource;
 3 import java.io.InputStream;
 4 import java.sql.Connection;
 5 import java.sql.ResultSet;
 6 import java.sql.SQLException;
 7 import java.sql.Statement;
 8 import java.util.Properties;
 9 
10 public class DBCPUtils02 {
11     private static DataSource dataSource;
12     static {
13         Properties properties = new Properties ();
14         //使用类加载将文件转换成流
15         //获取类加载器对象:当前类名.class.getClassLoader();
16         ClassLoader classLoader = DBCPUtils02.class.getClassLoader ();
17         //调用classLoader的getResourceAsStream()方法,将资源文件转换成流
18         InputStream inStream = classLoader.getResourceAsStream ("dbcpconfig.properties");
19         //1.创建连接池对象
20         try {
21             //使用properties将文件转换成的流加载进来
22             properties.load (inStream);
23             //使用连接池工厂创建连接池
24             dataSource = BasicDataSourceFactory.createDataSource (properties);
25         } catch (Exception e) {
26             e.printStackTrace ();
27         }
28     }
29 
30     // 从DBCP连接池中获取连接
31     public static Connection getConnection() throws SQLException {
32         return dataSource.getConnection ();
33     }
34 
35     //释放资源
36     public static void close(ResultSet resultSet, Statement statement, Connection conn)  {
37        if (resultSet != null){
38            try {
39                resultSet.close ();
40            } catch (SQLException e) {
41                e.printStackTrace ();
42            }
43        }
44        if (statement != null){
45            try {
46                statement.close ();
47            } catch (SQLException e) {
48                e.printStackTrace ();
49            }
50        }
51        if (conn != null) {
52            try {
53                conn.close ();
54            } catch (SQLException e) {
55                e.printStackTrace ();
56            }
57        }
58     }
59 }

(二) C3P0连接池

  C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

1、C3P0的核心类:CombopooledDataSource。

2、相关jar包下载链接:https://sourceforge.net/projects/c3p0/files/latest/download?source=files

3、依赖包:c3p0-0.9.5.2.jar 和mchange-commons-java-0.2.11.jar包、mysql-connector-java-5.1.44-bin.jar(针对MySQL数据库)

4、c3p0也可以指定配置文件,而配置文件可以是properties,也可以是xml的,当然xml高级一些,但是c3p0的配置文件名必须为“c3p0-config.xml”,并放在类的路径下(src下)。

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <c3p0-config>
 3     <!--默认配置信息-->
 4     <default-config>
 5         <!--连接四大参数配置-->
 6         <property name="droverClass">com.mysql.jdbc.Driver</property>
 7         <property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property>
 8         <property name="user">root</property>
 9         <property name="password"></property>
10         <!--池参数配置-->
11         <property name="acquireIncrement">3</property>
12         <property name="initialPoolSize">10</property>
13         <property name="minPoolSize">2</property>
14         <property name="maxPoolSize">10</property>
15     </default-config>
16     <!-- 专门为oracle提供的配置信息 -->
17     <named-config name="oracle-config">
18         <!--连接四大参数配置-->
19         <property name="droverClass">oracle.jdbc.driver.OracleDriver</property>
20         <property name="jdbcUrl">jdbc:oracle:thin:@地址:端口:ORCL</property>
21         <property name="user">root</property>
22         <property name="password"></property>
23         <!--池参数配置-->
24         <property name="acquireIncrement">3</property>
25         <property name="initialPoolSize">10</property>
26         <property name="minPoolSize">2</property>
27         <property name="maxPoolSize">10</property>
28     </named-config>
29 </c3p0-config>

 5、C3P0 使用示例:

 1 import com.mchange.v2.c3p0.ComboPooledDataSource;
 2 import java.sql.Connection;
 3 import java.sql.ResultSet;
 4 import java.sql.SQLException;
 5 import java.sql.Statement;
 6 
 7 /**
 8  * Created by kong on 12/12/2017.
 9  */
10  
11 public class C3P0Utils02 {
12     private static ComboPooledDataSource dataSource;
13     static {
14         //创建连接池对象
15         dataSource = new ComboPooledDataSource ();
16     }
17     //获取连接
18     public static Connection getConnection() throws SQLException {
19         return dataSource.getConnection ();
20     }
21     //释放资源
22     public static void close(ResultSet resultSet, Statement statement,Connection connection) throws SQLException {
23         if (resultSet != null){
24             resultSet.close ();
25         }
26         if (statement != null){
27             statement.close ();
28         }
29         if (connection != null){
30             connection.close ();
31         }
32     }
33 }    

(三) Druid 连接池

  Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。

1、核心类:DruidDataSourceFactory

2、依赖包:druid-1.1.0.jar、mysql-connector-java-5.1.44-bin.jar

3、配置文件:druidconfig.properties 放置于src下

url=jdbc:mysql://localhost:3306/mydb1
driverClassName=com.mysql.jdbc.Driver
username=root
password=
filters=stat
maxActive=20
initialSize=1
maxWait=60000
minIdle=10
maxIdle=15
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT'x'
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
maxOpenPreparedStatements=20
removeAbandoned=true
removeAbandonedTimeout=1800
logAbandoned=true

4、Druid使用示例:

 1 import com.alibaba.druid.pool.DruidDataSourceFactory;
 2 import javax.sql.DataSource;
 3 import java.io.InputStream;
 4 import java.sql.Connection;
 5 import java.sql.PreparedStatement;
 6 import java.sql.ResultSet;
 7 import java.sql.SQLException;
 8 import java.util.Properties;
 9 
10 public class DruidUtil {
11     private static DataSource dataSource;
12     static {
13         Properties properties = new Properties ();
14         ClassLoader classLoader = DruidUtils02.class.getClassLoader ();
15         InputStream resourceAsStream = 
16                 classLoader.getResourceAsStream ("druidconfig.properties");
17         try {
18             properties.load (resourceAsStream);
19             dataSource = DruidDataSourceFactory.createDataSource(properties);
20         } catch (Exception e) {
21             e.printStackTrace ();
22         }
23     }
24 
25     public static Connection getConnection() throws SQLException {
26         return dataSource.getConnection ();
27 
28     }
29 
30     public static void close(ResultSet resultSet, PreparedStatement prsm,Connection conn){
31         if (resultSet !=null){
32             try {
33                 resultSet.close ();
34             } catch (SQLException e) {
35                 e.printStackTrace ();
36             }
37         }
38         if (prsm != null){
39             try {
40                 prsm.close ();
41             } catch (SQLException e) {
42                 e.printStackTrace ();
43             }
44         }
45         if (conn != null) {
46             try {
47                 conn.close ();
48             } catch (SQLException e) {
49                 e.printStackTrace ();
50             }
51         }
52 
53     }
54 }
原文地址:https://www.cnblogs.com/gdwkong/p/7633019.html