当前位置: 澳门新濠3559 > 编程 > 正文

1.如何获取Connection对象,应用程序需要建立数据

时间:2019-10-07 13:13来源:编程
- 自定义连接池 普通的JDBC数据库连接使用 DriverManager来获取,每次向数据库建立连接的时候都要将 Connection加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接

- 自定义连接池

普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。连接池可以避免这些问题实现步骤:

  1. 指定全局参数 : 初始化数目 最大连接数 当前连接 连接池集合
  2. 在构造函数中 : 循环创建三个连接
  3. 实现一个创建连接的方法
  4. 获取连接
  5. 关闭连接

代码部分:

package com.demo01.test;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.LinkedList;/** * Created by pc on 17-5-1. */public class MyPool { private int init_count = 3; //初始化链接数目 private int max_count = 6; //最大连接数目 private int current_count; //记录连接数 //连接池,存放所有初始化连接 private LinkedList<Connection> pool = new LinkedList<Connection>(); //1.构造函数中将初始化连接放入连接池中 public MyPool() { //初始化连接 for (int i = 0; i < init_count; i  ) { //记录当前连接条数 current_count  ; //把连接放入连接池中 pool.addLast(createConnection; } } //2.创建一个新的连接对象 public Connection createConnection() { try { Class.forName("com.mysql.jdbc.Driver"); return DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbcdemo", "root", "root"); } catch (ClassNotFoundException e) { throw new RuntimeException; } catch (SQLException e) { e.printStackTrace(); } return null; } //3.获取连接 public Connection getConnection() { //判断连接池是否有连接,如果有则直接取出 if (pool.size { return pool.removeFirst(); } //如果连接池的连接以取完,判断是否超过最大连接数,如果没有则创建 if (current_count < max_count) { current_count  ; return createConnection(); } //如果超过最大连接数,则抛出异常 throw new RuntimeException("超过最大连接数"); } //4.释放链接 public void realeaseConnection(Connection connection) throws SQLException { //如果连接池没有放满连接,则将该链接放回连接池 if (current_count < pool.size { pool.addLast(connection); current_count--; } else { connection.close(); current_count--; } }}

一、连接池的概念和使用

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。

1.连接池思想

- DBCP连接池

DBCP(DataBase connection pool)数据库连接池是 apache 上的一个Java连接池项目。DBCP通过连接池预先同数据库建立一些连接放在内存中,应用程序需要建立数据库连接时直接到从接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用,减少资源消耗的目的。引入jar文件,使用maven配置这两个文件:

  • commons-dbcp2
  • commons-pool2
 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.0.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.2</version> </dependency>

代码部分

package com.demo01.test;import org.apache.commons.dbcp2.BasicDataSource;import org.junit.Test;import java.sql.Connection;import java.sql.SQLException;/** * Created by pc on 17-5-1. */public class Test_dbcp { @Test public void testDbcp() throws SQLException { //DBCP连接池核心 BasicDataSource dataSource = new BasicDataSource(); //连接池参数配置:初始化连接数,最大连接数 /连接字符串,驱动,用户,密码 dataSource.setUrl("jdbc:mysql:///jdbcdemo?useUnicode=true&characterEncoding=utf-8"); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); dataSource.setUsername; dataSource.setPassword; dataSource.setInitialSize; dataSource.setMaxIdle; //dataSource.setMaxTotal; //获取连接 Connection conn = dataSource.getConnection(); conn.prepareStatement("delete FROM admin where id=9").executeUpdate(); //关闭连接 conn.close(); }}

澳门新濠3559 1image.png

 

数据库连接池简介:

为什么必须使用数据库连接池:

  • 普通的JDBC数据库连接(Connectiond对象)使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间),数据库的连接是比较昂贵的(创建的成本比较大)

  • 需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。

  • 数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

澳门新濠3559 2

不使用连接池1.png

澳门新濠3559 3

不使用连接池2.png

澳门新濠3559 4

连接池的设计.png


- c3p0连接池

c3p0与dbcp区别dbcp没有自动回收空闲连接的功能c3p0有自动回收空闲连接功能demo

package demo01.utils;import com.mchange.v2.c3p0.ComboPooledDataSource;import org.junit.Test;import java.sql.Connection;public class demo { @Test //1. 硬编码方式,使用C3P0连接池管理连接 public void testCode() throws Exception { // 创建连接池核心工具类 ComboPooledDataSource dataSource = new ComboPooledDataSource(); // 设置连接参数:url、驱动、用户密码、初始连接数、最大连接数 dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/jdbcdemo"); dataSource.setDriverClass("com.mysql.jdbc.Driver"); dataSource.setUser; dataSource.setPassword; dataSource.setInitialPoolSize; dataSource.setMaxPoolSize; dataSource.setMaxIdleTime; // ---> 从连接池对象中,获取连接对象 Connection con = dataSource.getConnection(); // 执行更新 con.prepareStatement("delete from admin where id=7").executeUpdate(); // 关闭 con.close(); } @Test //2. XML配置方式,使用C3P0连接池管理连接 public void testXML() throws Exception { // 创建c3p0连接池核心工具类 ComboPooledDataSource dataSource = new ComboPooledDataSource();// 使用默认的配置 // 获取连接 Connection con = dataSource.getConnection(); // 执行更新 con.prepareStatement("delete from admin where id=5").executeUpdate(); // 关闭 con.close(); }}

澳门新濠3559 5原始数据表澳门新濠3559 6操作后的数据表

在实际应用开发中,特别是在WEB应用系统中,如果JSP、Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接、打开数据库、存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。数据库连接池技术是解决这个问题最常用的方法。

数据库连接对象是有限资源,所以数据库连接池是用于负责分配、管理和释放数据库连接对象,它允许应用程序重复使用一个现有的数据库连接对象,而不是再重新建立一个;这一点实际上和线程池的概念差不多。数据库连接池会释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏,这项技术能明显提高对数据库操作的性能。 不使用线程池的话用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。如下图所示:

Java中

  • 在Java中,连接池使用javax.sql.DataSource接口来表示连接池.

  • DataSource(数据源)和连接池(Connection Pool)是同一个.

注意:DataSource仅仅只是一个接口,由各大服务器厂商来实现(Tomcat,JBoss).


数据库连接池的主要操作如下:

澳门新濠3559 7

常用的DataSource的实现:

  • DBCP: Spring框架推荐的
  • C3P0: Hibernate框架推荐的
  • druid: 阿里巴巴的连接池(号称Java语言中性能最好的连接池).

(1)建立数据库连接池对象。

数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。如下图所示:

使用连接池和不使用连接池的区别在哪里?

1.如何获取Connection对象:

  • 没有使用连接池:
Connection conn = DriverManager.getConnection(url,username,password);
  • 使用连接池:
Connection conn = DataSource对象.getConnection();

只要获取了Connection对象不同,接下来的操作和以前是一模一样的.关键在于:如何创建DataSource对象.

2.如何释放Connection对象(Connection对象.close()):

  • 没有使用连接池: 是和数据库服务器断开.
  • 使用连接池: 是把Connection对象返还给连接池中,并没有和数据库服务器断开.

面试题:请你设计一个数据库连接池.


(2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。

澳门新濠3559 8

2.dbcp连接池

DBCP连接池是Apache提供的,性能也不错:

(3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。

在Java连接MySQL数据库中,最常用的是DBCP和C3P0连接池。DBCP(DataBase Connection Pool)数据库连接池,是java数据库连接池的一种,由Apache开发,也是 tomcat 使用的连接池组件。C3P0则是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。 c3p0与dbcp区别:

准备:

  • 1.拷贝jar:commons-dbcp-1.4.jar , commons-pool-1.5.6.jar
  • 2.build path,添加到classpath路径.
  • 3.阅读文档:commons-dbcp-1.3-srcdocBasicDataSourceExample.java

(4)存取数据库。

dbcp没有自动回收空闲连接的功能

使用

public static DataSource getDataSource(){
        BasicDataSource ds=new BasicDataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql:///jarry");
        ds.setUsername=("root");
        ds.setPassword("123456");
        ds.setMaxActive(10);//设置最大连接数
        return ds;
    }

(5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。

c3p0有自动回收空闲连接功能

优化

分析上述代码:上述代码存在硬编码,不利用维护.
解决方案:把数据库连接池的信息配置到配置文件中去:dbcp.properties:
编写该文件:key名必须等于BasicDataSource中的属性名(由setter方法决定).

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///jdbcdemo
username=root
password=admin
maxActive=10

新的问题:如何读取dbcp.properties文件,如何获取其中的数据信息.

澳门新濠3559 9

DBCP.png

(6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。

一般情况下,c3p0的使用率较高于dbcp,在公司用得比较多的也是c3p0。

3.c3p0连接池

c3p0连接池,是Hibernate推荐使用的连接池,该连接池已有接近10年没有更新了.
很多人说c3p0性能很高,其实是在测试环境高,真实应用中很低.

 

数据库连接池的运行机制:

准备:

  • 1.拷贝jar:c3p0-0.9.1.2.jar
  • 2.build path,添加到classpath路径.
  • 3.阅读文档:c3p0-0.9.1.2/doc/index.html#quickstart.

 

(1) 程序初始化时创建连接池

澳门新濠3559,使用

澳门新濠3559 10

c3p0.png

二、开源的连接池项目 DBCP 和 C3P0

(2) 使用时向连接池申请可用连接

优化

分析上述代码:上述代码存在硬编码,不利用维护.
解决方案:把c3p0的连接信息存放到配置文件中.
c3p0配置文件使用注意:

  • 1.配置文件名称,必须叫做:c3p0.properties或者c3p0-config.xml.
  • 2.c3p0.properties文件必须存放与classpath的根路径.
  • 3.要求c3p0.properties文件中所有的key必须以c3p0.作为前缀,如:c3p0.jdbcUrl.
  • 4.要求c3p0.properties文件中的key,必须是ComboPooledDataSource对象中的属性名.

新的问题:如何读取c3p0.properties文件,如何获取其中的数据信息.

澳门新濠3559 11

c3p0.png

 

(3) 使用完毕,将连接返还给连接池

4.阿里巴巴的连接池-druid

druid:是阿里巴巴研发出来的号称Java语言领域性能最高的连接池.
wiki地址:https://github.com/alibaba/druid/wiki
使用起来,类似于DBCP连接池.

1. DBCP(DataBase connection pool),**数据库连接池**,是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar。最新jar包为commons-dbcp2-2.1和commons-pool2-2.4.1,支持java7以上

(4) 程序退出时,断开所有连接,并释放资源

优点

  • 方便检测性能/状态.
  • 支持:MySQL,Oracle,DB2,MS Server等.
  • 支持:对配置文件的密码加密.

 

示意图:

使用:

拷贝jar:druid-1.0.15.jar.

因为druid和dbcp的属性完全相同名,所以可以使用dbcp的属性文件

澳门新濠3559 12

druid.png

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

澳门新濠3559 13

5.各大连接池的比较

澳门新濠3559 14

连接池对比.png

 

数据库连接池的最小连接数和最大连接数的设置要考虑到以下几个因素:

结论

  • 1.Druid是性能最好的数据库连接池,tomcat-jdbc和druid性能接近。
  • 2.proxool在激烈并发时会抛异常,完全不靠谱。
  • 3.c3p0和proxool都相当慢,慢到影响sql执行效率的地步。
  • 4.bonecp性能并不优越,采用LinkedTransferQueue并没有能够获取性能提升。
  • 5.除了bonecp,其他的在JDK7上跑比JDK6上快。
  • 6.jboss-datasource虽然稳定,但性能很糟糕

dbcp没有自动回收空闲连接的功能,c3p0有自动回收空闲连接功能

1, 最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.

 

2, 最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作

三、DBCP 和C3P0的使用

3, 如果最小连接数与最大连接数相差很大:那么最先连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接.不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放.

 

DBCP:

1.DBCP使用

DBCP有几个版本,其中的1.x和2.x版本的区别比较大,而且在2.x版本中称为DBCP2。DBCP 2基于Commons Pool 2,与DBCP 1.x相比,提供了更高的性能,JMX支持以及众多其他新功能。由于DBCP 2.x与DBCP 1.x不是二进制兼容,所以升级到2.x的用户应该知道Java包名称已经改变,以及Maven坐标。用户还应该注意,一些配置选项(例如maxActive to maxTotal)已被重命名,以将它们与Commons Pool 2使用的新名称进行对齐。

①将commons-dbcp2-2.1和commons-pool2-2.4.1导入项目

不同版本的DBCP对JDK也有要求:

②配置文件为dbcpconfig.properties,连接设置自行配置,内容如下:

DBCP 1.3 版本只能运行于 JDK 1.4-1.5 ,支持 JDBC 3

 1 #连接设置
 2 driverClassName=com.mysql.jdbc.Driver
 3 url=jdbc:mysql://localhost:3306/day16
 4 username=root
 5 password=123456
 6 
 7 #<!-- 初始化连接 -->
 8 initialSize=10
 9 
10 #最大连接数量
11 maxActive=50
12 
13 #<!-- 最大空闲连接 -->
14 maxIdle=20
15 
16 #<!-- 最小空闲连接 -->
17 minIdle=5
18 
19 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
20 maxWait=60000
21 
22 
23 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
24 #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
25 connectionProperties=useUnicode=true;characterEncoding=utf8
26 
27 #指定由连接池所创建的连接的自动提交(auto-commit)状态。
28 defaultAutoCommit=true
29 
30 #driver default 指定由连接池所创建的连接的只读(read-only)状态。
31 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
32 defaultReadOnly=
33 
34 #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
35 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
36 defaultTransactionIsolation=REPEATABLE_READ

DBCP 1.4 版本只能运行于 JDK 1.6 ,支持 JDBC 4

 

DBCP 2.x 版本只能运行于 JDK 1.7 ,支持 JDBC 4.1

③写一个工具类,功能类似于jdbc基础 (二) 通过properties配置文件连接数据库中的JdbcUtils,不过此处原理为从连接池中获取一个数据源,通过数据源来获取Connection对象。代码如下:

DBCP的jar包可以直接在Maven库上下载,只需要找到依赖后配置一下即可,普通工程则去Apache官网下载jar然后导入到工程里即可:

package com.cream.ice.jdbc;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;

/**
 * DBCP工具类
 * DBCP使用的默认适配器方式,当Connection对象调用close()方法时,将Connection对象放回连接池中,实际上并不关闭连接
 * 通过dbcpconfig.properties文件配置数据库、连接池参数
 * 
 * @author ice
 *
 */
public class DBCPUtils {

    public static DataSource dataSource;

    static {
        try {
            InputStream in = DBCPUtils.class.getClassLoader()
                    .getResourceAsStream("dbcpconfig.properties");
            Properties properties = new Properties();
            properties.load(in);

            //返回数据源对象
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取数据源
     * @return 数据源
     */
    public static DataSource getDataSource(){
        return dataSource;
    }

    /**
     * 从连接池中获取连接
     * @return 
     */
    public static Connection getConnection(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 释放资源
     */
    public static void releaseResources(ResultSet resultSet,
            Statement statement, Connection connection) {

        try {
            if (resultSet != null)
                resultSet.close();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            resultSet = null;
            try {
                if (statement != null)
                    statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                statement = null;
                try {
                    if (connection != null)
                        connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                } finally {
                    connection = null;
                }
            }
        }
    }
}

Apache官网下载地址:

 

http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi

2.C3P0使用

Maven中央仓库配置依赖:

①导入c3p0-0.9.5.1.jar和mchange-commons-java-0.2.10.jar

澳门新濠3559 15

②设置数据库方法有三种:

配置依赖到pom文件中:

1.setters一个个地设置各个配置项 
2.类路径下提供一个c3p0.properties文件 
3.类路径下提供一个c3p0-config.xml文件 

澳门新濠3559 16

这里采用第三种,配置文件为c3p0-config.xml,内容如下:

可以看到下载了以下三个jar包:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 
 3 <c3p0-config>
 4   <default-config>
 5     <property name="driverClass">com.mysql.jdbc.Driver</property>
 6     <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property>
 7     <property name="user">root</property>
 8     <property name="password">123456</property>
 9     
10     <property name="checkoutTimeout">30000</property>
11     <property name="initialPoolSize">10</property>
12     <property name="maxIdleTime">30</property>
13     <property name="maxPoolSize">100</property>
14     <property name="minPoolSize">10</property>
15     <property name="maxStatements">200</property>
16 
17     <user-overrides user="test-user">
18       <property name="maxPoolSize">10</property>
19       <property name="minPoolSize">1</property>
20       <property name="maxStatements">0</property>
21     </user-overrides>
22 
23   </default-config>
24 
25   <!-- This app is massive! -->
26   <named-config name="intergalactoApp"> 
27     <property name="acquireIncrement">50</property>
28     <property name="initialPoolSize">100</property>
29     <property name="minPoolSize">50</property>
30     <property name="maxPoolSize">1000</property>
31 
32     <!-- intergalactoApp adopts a different approach to configuring statement caching -->
33     <property name="maxStatements">0</property> 
34     <property name="maxStatementsPerConnection">5</property>
35 
36     <!-- he's important, but there's only one of him -->
37     <user-overrides user="master-of-the-universe"> 
38       <property name="acquireIncrement">1</property>
39       <property name="initialPoolSize">1</property>
40       <property name="minPoolSize">1</property>
41       <property name="maxPoolSize">5</property>
42       <property name="maxStatementsPerConnection">50</property>
43     </user-overrides>
44   </named-config>
45 </c3p0-config>

澳门新濠3559 17

 

如果是2.x以下的版本只有2个包:commons-dbcpjar和commons-pool.jar

③编写工具类,代码如下:

我们都知道Java只做规范不做实现,所以同样的,Java制定了数据库连接池的实现接口,这个接口就是DataSource,所有的数据库连接池数据源类都需要实现这个接口。DBCP中实现了DataSource数据源接口的类是BasicDataSource,我们需要通过数据源实现类来获得连接对象,这个类充当一个管理员的角色:

 1 package com.cream.ice.jdbc;
 2 
 3 import java.sql.Connection;
 4 import java.sql.ResultSet;
 5 import java.sql.SQLException;
 6 import java.sql.Statement;
 7 
 8 import javax.sql.DataSource;
 9 
10 import com.mchange.v2.c3p0.ComboPooledDataSource;
11 
12 /**
13  * C3P0工具类
14  * DBCP使用动态代理,当Connection对象调用close()方法时,将Connection对象放回连接池中,实际上并不关闭连接
15  * 通过c3p0-config.xml文件配置数据库、连接池参数
16  * @author ice
17  *
18  */
19 public class C3P0Utils {
20     /**
21      * 数据源
22      */
23     public static ComboPooledDataSource cpDataDataSource = new ComboPooledDataSource();
24     
25     /**
26      * 获取数据源
27      * @return 数据源
28      */
29     public static DataSource getDataSource() {
30         return cpDataDataSource;
31     }
32     
33     /**
34      * 从连接池中获取连接
35      * @return 
36      */
37     public static Connection getConnection(){
38         try {
39             return cpDataDataSource.getConnection();
40         } catch (SQLException e) {
41             throw new RuntimeException(e);
42         }
43     }
44     
45     /**
46      * 释放资源
47      */
48     public static void releaseResources(ResultSet resultSet,
49             Statement statement, Connection connection) {
50 
51         try {
52             if (resultSet != null)
53                 resultSet.close();
54         } catch (SQLException e) {
55             e.printStackTrace();
56         } finally {
57             resultSet = null;
58             try {
59                 if (statement != null)
60                     statement.close();
61             } catch (SQLException e) {
62                 e.printStackTrace();
63             } finally {
64                 statement = null;
65                 try {
66                     if (connection != null)
67                         connection.close();
68                 } catch (SQLException e) {
69                     e.printStackTrace();
70                 } finally {
71                     connection = null;
72                 }
73             }
74         }
75     }
76 }

澳门新濠3559 18

 

下面我们做一个实验来演示如何使用DBCP连接池:

DBCPUtils和C3P0Utils与JdbcUtils的用法别无二致,区别只是释放资源时,Connection对象调用close()方法时,只是将Connection对象放回连接池中,实际上并不关闭连接。

代码示例:

澳门新濠3559 19

运行结果:

澳门新濠3559 20

从这个例子可以看出,实际使用连接池和直接使用JDBC来创建数据库连接对象,在代码上没什么太大的区别,一样的得加载Driver驱动类,也要设置url和用户密码。只不过使用连接池是通过数据源对象去池子里获得连接对象而已。

C3P0:

C3P0也是可以到Maven中央仓库里查询依赖,然后配置到pom文件里即可,C3P0和DBCP的使用方式没什么区别,只是方法和数据源实现类的名称不一样而已。

澳门新濠3559 21

配置语法:

澳门新濠3559 22

可以看到下载了以下两个jar包:

澳门新濠3559 23

下面我们使用C3P0连接池也来做一下刚刚那个实验:

代码示例:

澳门新濠3559 24

运行结果:

澳门新濠3559 25

有一点要注意的是,如果你工程环境里有log4j,并且配置文件里的级别设置为DEBUG的话,C3P0会自动调用log4j打印一些DEBUG信息:

澳门新濠3559 26

澳门新濠3559 27

如果不想打印那么多C3P0的DEBUG信息,就把配置文件里的级别改为ERROR只打印错误信息级别即可:

澳门新濠3559 28

编辑:编程 本文来源:1.如何获取Connection对象,应用程序需要建立数据

关键词: 澳门新濠3559