27、jdbc操作数据库(4)

版权声明:chaizepeng https://blog.csdn.net/chaizepeng/article/details/86693724

数据库连接池是什么?为什么使用连接池?

当使用jdbc去操作数据库时,需要先获取连接,然后进行具体的数据库操作,最后释放连接。这一系列操作在演示一个demo时还可以使用,但是当访问数据库次数多了的时候,就会显得很繁琐,除此之外还容易造成内存泄漏、数据库崩溃等复杂问题。所以为了解决这一问题,就出现了数据库连接池,顾名思义就是使用一个盛有数据库连接的池子来管理数据库连接,连接池负责分配、管理和释放数据库连接,可以控制数据库连接的个数,其基本思想就是预先将一定数量的数据库连接放到一个池子中,所谓的池子就是一块缓冲区,当使用连接时直接去连接池中获取即可,用完再放回到池子中,这样直接从内存中获取而不需要重复操作数据库,提高了效率和性能。

怎么使用连接池

java中提供了数据库连接池对应的接口:javax.sql.DataSource,对连接的管理都通过此接口对象实现,一般需要第三方实现或者服务器提供实现,这里介绍三种第三方提供的连接池,分别是:dbcp、c3p0、druid。连接池通常也被成为数据源,包含连接池和连接池管理两部分,接下来详细介绍一下怎么使用这三种连接池。

dbcp

首先需要添加第三方连接池的jar包:

commons-dbcp2-2.3.0.jar、commons-logging-1.2.jar、commons-pool2-2.5.0.jar

因为使用连接池管理连接,所以需要创建一个dbcp.properties用来配置连接数据库的信息,使用org.apache.commons.dbcp2.BasicDataSourceFactory工厂类来创建一个数据源,然后使用提供的Datasource实现类org.apache.commons.dbcp2.BasicDataSource来获取对应的连接即可。在配置dbcp.properties时一定要注意,键的名称必须和BasicDataSource类中定义的成员变量名称一致,否则报错。实例代码如下:

//--------------------------dbcp.properties---------------------//
driver=com.mysql.jdbc.Driver
#jdbc:database://host:port/dbName
url=jdbc:mysql://127.0.0.1:3306/fqx_webapp
username=root
password=123456
#这里只配置一下maxTotal参数作为实例,说明可以通过配置dbcp的参数来预定义连接池的各个属性,参数可以参照org.apache.commons.dbcp2.BasicDataSource类中的成员变量
maxTotal=16

//--------------------------代码实现----------------------------//
public static void main(String[] args) {
	Properties properties = new Properties();
	InputStream inStream = ConnectionPoolTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
	// BasicDataSource类是dbcp提供的类,实现了javax.sql.DataSource接口
	BasicDataSource basicDataSource = null;
	try {
		properties.load(inStream);
		basicDataSource = BasicDataSourceFactory.createDataSource(properties);
		System.out.println(basicDataSource);
		//可以获取和修改连接池的配置参数
		System.out.println(basicDataSource.getMaxTotal());
		//通过连接池获取连接,用完无需释放
		Connection connection = basicDataSource.getConnection();
		PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");
		ResultSet executeQuery = prepareStatement.executeQuery();
		while(executeQuery.next()){
			System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));
		}
	} catch (IOException e) {
		e.printStackTrace();
	} catch (Exception e) {
		e.printStackTrace();
	}
}

c3p0

首先需要添加第三方jar包:

c3p0-0.9.5.3.jar、mchange-commons-java-0.2.15.jar

需要创建一个c3p0-config.xml用来配置连接数据库的信息,然后使用提供的Datasource实现类com.mchange.v2.c3p0.ComboPooledDataSource来获取对应的连接池即可。

配置文件配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
    <default-config>
        <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/fqx_webapp</property>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <property name="acquireIncrement">5</property>
        <property name="initialPoolSize">30</property>
        <property name="maxPoolSize">30</property>
        <property name="minPoolSize">1</property>
    </default-config>
</c3p0-config>

实现代码如下:

public static void main(String[] args) {
	try {
		//获取数据源对象
		ComboPooledDataSource dataSource = new ComboPooledDataSource("c3p0-config.xml");
		Connection connection;
		//通过数据源获取连接
		connection = dataSource.getConnection();
		System.out.println(connection);
		PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");
		ResultSet executeQuery = prepareStatement.executeQuery();
		while(executeQuery.next()){
			System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));
		}
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

可通过c3p0 api 网址 https://www.mchange.com/projects/c3p0 进一步了解c3p0.

当连接获取失败时,c3p0具有重连机制,这一点比较诱人。

druid

首先需要添加第三方jar包:druid-1.1.10.jar

需要创建一个druid.properties用来配置连接数据库的信息,使用com.alibaba.druid.pool.DruidDataSourceFactory工厂类来创建一个数据源,然后使用提供的Datasource实现类com.alibaba.druid.pool.DruidDataSource来获取对应的连接即可。在配置druid.properties时一定要注意,键的名称必须和com.alibaba.druid.pool.DruidDataSourceFactory类中对应的常量值一致。实例代码如下:

//-------------druid.properties--------------------//
druid.driverClassName=com.mysql.jdbc.Driver
druid.url=jdbc:mysql://127.0.0.1:3306/fqx_webapp
druid.username=root
druid.password=123456

//--------------实现代码----------------------//
public static void main(String[] args) {
	try {
		
		Properties properties = new Properties();
		InputStream inStream = ConnectionPoolTest.class.getClassLoader().getResourceAsStream("druid.properties");
		properties.load(inStream);
		//获取数据源对象
		DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
		Connection connection;
		//通过数据源获取连接
		connection = dataSource.getConnection();
		System.out.println("druid-->"+connection);
		PreparedStatement prepareStatement = connection.prepareStatement("SELECT * FROM USER WHERE ID = 1");
		ResultSet executeQuery = prepareStatement.executeQuery();
		while(executeQuery.next()){
			System.out.println(executeQuery.getInt(1)+"--"+executeQuery.getString(2));
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	} catch (Exception e) {
		e.printStackTrace();
	}
}

druid集合了众家所长,号称是当前最好的数据库连接池,对数据库连接和sql的执行可以进行最大程度上的监控,这一点比较诱人。

猜你喜欢

转载自blog.csdn.net/chaizepeng/article/details/86693724