《JDBC连接技术》"江南月"(二)常用的连接池dbcp、c3p0、druid

我们应该知道,在进行数据库连接的时候,是极其消耗时间和性能的。如果每次对数据库进行操作,都要进行一次Connection,那么,可想而知,性能有多么的差。你要知道,一个大型的web应用,同一时间就可能有成千上万个访问数据库的请求,并且数据库服务器能供同时创建的Connection数目也是有限的。

因此,问题来了。怎么最大限度的利用这些有限资源呢?

数据库连接池的技术出现,解决了这一问题。连接池技术就是预先创建多个连接对象,保存到连接池中,当有客户请求时,从池中取出一个连接对象为客户服务,当请求完成后,客户程序调用close方法,将连接对象归还给连接池,已备其他客户使用,而不是真正的断开连接。这样就避免了每次请求都创建连接对象所带来的性能开销。

我这里简单的介绍一下常用的连接池技术:DBCP,C3P0,还有阿里的Druid。

1.DBCP

DBCP(DataBase connection pool)数据库连接池。是 Apache 上的一个 Java 连接池项目,也是 tomcat 使用的连接池组件。单独使用DBCP需要2个包commons-dbcp.jarcommons-pool.jar。由于建立数据库连接是一种非常耗时、耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,使用完毕后再归还到连接池中。数据库连接的释放和断开,由程序自动管理,大大方便了开发人员。

我使用的是dbcp2.0版本以上的jar包,如下:

不管使用哪种连接池技术,原理都是一样的,而常用的配置都是一样的,顶多配置参数的名称不同而已。下面介绍一下dbcp2.0版本以上的常用的配置参数(配置信息是写在src下的db.properties中的形式

#要连接的数据库的driverClassName
driverClassName=com.mysql.jdbc.Driver
#要传递给JDBC驱动程序以建立连接的连接URL。
url=jdbc:mysql://localhost:3306/db_test
#要传递给JDBC驱动程序以建立连接的连接用户。
username=root
#要传递给JDBC驱动程序以建立连接的连接密码。
password=mmforu
#同时从这个池中分配的活动连接的最大数量,或者为负,没有限制。dbcp1.0叫maxActive
maxTotal=20
#启动连接池时创建的初始连接数。
initialSize=1
#池在抛出异常之前(当没有可用连接时)等待返回连接的最大毫秒数,或者<= 0无限期等待。
maxWaitMillis=60000
#最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制
maxIdle=8
#池中可以保持空闲的活动连接的最小数量
minIdle=3

封装一个DBUtil工具类:

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.commons.dbcp2.BasicDataSource;

public class DBUtil {
	//定义一个静态的连接池对象
	private static BasicDataSource pool = new BasicDataSource();
	static {
		try {
			//创建一个Properties对象,加载db.properties里的配置信息
			Properties prop = new Properties();
			InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties");
			//加载配置信息
			prop.load(is);
			//设置连接池常用属性
			pool.setDriverClassName(prop.getProperty("driverClassName"));
			pool.setUrl(prop.getProperty("url"));
			pool.setUsername(prop.getProperty("username"));
			pool.setPassword(prop.getProperty("password"));
			pool.setMaxTotal(Integer.parseInt(prop.getProperty("maxTotal")));
			pool.setInitialSize(Integer.parseInt(prop.getProperty("initialSize")));
			pool.setMaxWaitMillis(Long.parseLong(prop.getProperty("maxWaitMillis")));
			pool.setMaxIdle(Integer.parseInt(prop.getProperty("maxIdle")));
			pool.setMinIdle(Integer.parseInt(prop.getProperty("minIdle")));
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public static Connection getConnection() throws SQLException {
		return pool.getConnection();
	}

	public static void close(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
        public static void main(String[] args) {
		try {
			Connection conn = getConnection();
			System.out.println(conn);
			close(conn);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

工具类写好了,对数据库的增删改查操作,这里就不做测试了!!!!没有必要。

2.C3P0

关于c3p0的配置,我这里只介绍xml配置文件的写法。至于properties配置文件的写法就不累述了,参考上述的dbcp,稍微注意一下参数名就行了。种是通过在同src目录下的c3p0-conflg.xml文件或者c3p0.properties文件进行相关的配置。

我用的是如下jar包

我们将c3p0-config.xml文件放置在src目录下,常用属性如:



    
    
        root
        mmforu
        jdbc:mysql://localhost:3306/db_test
        com.mysql.jdbc.Driver
        
        10
        
        50
        
        2
        
        5
        
        600
    

封裝DBUtil工具类

import java.sql.Connection;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DBUtil {
	//定义一个静态的c3p0的连接池属性,利用构造器加载src下的配置文件,c3p0会自动装置配置信息
	private static ComboPooledDataSource pool = new ComboPooledDataSource("c3p0-config");
	/**
	    * 获取连接池中的一个连接对象
	 */
	public static Connection getConnection() throws SQLException {
		return pool.getConnection();
	}

	public static void close(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
	//测试连接
	public static void main(String[] args) throws SQLException {
		Connection conn = getConnection();
		System.out.println(conn);
		close(conn);
	}
}

同样的,我不做测试了。

3.Druid

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况。

我使用的jar包是:

 

可以使用properties配置文件,将db.properties配置文件放在src目录下:

driverClassName=com.mysql.jdbc.Driver
jdbcurl=jdbc:mysql://localhost:3306/db_test
username=root
password=mmforu
#启动连接池时,初始化连接的个数
initialSize=5
#连接池中最大连接数
maxActive=20
#获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。
maxWait=3000
#最大空闲连接数,已经弃用,配置了也没作用
maxIdle=6
#最小空闲连接数
minIdle=3

编写DBUtil工具类:

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DBUtil {
	private static DataSource source;
	static {
		try {
			Properties prop = new Properties();
			prop.load(DBUtil.class.getClassLoader().getResourceAsStream("db3.properties"));
			//调用工厂类的静态方法,获取连接池
			source = DruidDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static Connection getConnection() throws SQLException {
		return source.getConnection();
	}

	public static void close(Connection conn) {
		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) throws SQLException {
		Connection conn = getConnection();
		System.out.println(conn);
		close(conn);
	}

}

ok,如果想要知道三个连接池技术的详细参数,请先百度吧,等有时间,我再整理他们的详细参数。

--------------------------------------------------------------------------如有疑问,敬请留言---------------------------------------------------------------------------

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(mysql,数据库连接技术)