我们应该知道,在进行数据库连接的时候,是极其消耗时间和性能的。如果每次对数据库进行操作,都要进行一次Connection,那么,可想而知,性能有多么的差。你要知道,一个大型的web应用,同一时间就可能有成千上万个访问数据库的请求,并且数据库服务器能供同时创建的Connection数目也是有限的。
因此,问题来了。怎么最大限度的利用这些有限资源呢?
数据库连接池的技术出现,解决了这一问题。连接池技术就是预先创建多个连接对象,保存到连接池中,当有客户请求时,从池中取出一个连接对象为客户服务,当请求完成后,客户程序调用close方法,将连接对象归还给连接池,已备其他客户使用,而不是真正的断开连接。这样就避免了每次请求都创建连接对象所带来的性能开销。
我这里简单的介绍一下常用的连接池技术:DBCP,C3P0,还有阿里的Druid。
DBCP(DataBase connection pool)数据库连接池。是 Apache 上的一个 Java 连接池项目,也是 tomcat 使用的连接池组件。单独使用DBCP需要2个包:commons-dbcp.jar和commons-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();
}
}
}
工具类写好了,对数据库的增删改查操作,这里就不做测试了!!!!没有必要。
关于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);
}
}
同样的,我不做测试了。
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,如果想要知道三个连接池技术的详细参数,请先百度吧,等有时间,我再整理他们的详细参数。
--------------------------------------------------------------------------如有疑问,敬请留言---------------------------------------------------------------------------