浅析数据库连接池(二)

上一篇博客,主要是简单的介绍了普通数据库连接的过程以及耗费的资源,并且简单的谈了下连接池,这篇我们主要来看看数据库连接池的使用以及它最优的配置。

总目录: -1.数据库连接过程是怎样的? -2.连接所占用的资源有哪些? -3.连接池简介 -4.连接池的使用 -5.最优连接池配置选择

今天主要看看4和5。

4.连接池的使用

这里我使用的是c3p0数据库连接池 简单的介绍一下c3p0:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

连接池的种类也有很多,而且每种也有不同的适用场景,所以选择适合自己的连接池也是一方面~

先放不使用连接池和使用连接池的数据对比。 循环连接10次,图片为测试的第10组数据。

不使用连接池

使用连接池 红色为连接池部分配置信息

从图片我们可以明显的看出,连接池的速度要快于普通连接很多,这里很多不是指的二者差多少毫秒,而是倍数的差别。

java连接池代码:import com.mchange.v2.c3p0.ComboPooledDataSource;import java.awt.color.ProfileDataException;import java.beans.PropertyVetoException;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ResourceBundle;/** * Created by wwh on 15-6-10. */{private static DBPollClass dbPoll;private ComboPooledDataSource dbSource;//静态代码块,一开始我们就执行构造函数加载配置信息static {dbPoll = new DBPollClass();}public DBPollClass(){//设置配置信息try{dbSource = new ComboPooledDataSource();dbSource.setUser(“root”);dbSource.setPassword(“123456789”);dbSource.setJdbcUrl(“jdbc:mysql://127.0.0.1:3306/XL_db?user=root&password=123456789&useUnicode=true”);dbSource.setDriverClass(“com.mysql.jdbc.Driver”);dbSource.setInitialPoolSize(1);dbSource.setMinPoolSize(2);dbSource.setMaxPoolSize(10);dbSource.setMaxStatements(50);dbSource.setMaxIdleTime(60);}catch (PropertyVetoException e){throw new RuntimeException(e);}}DBPollClass getInstance(){return dbPoll;}public final Connection getConnection(){try{return dbSource.getConnection();}catch (SQLException e){throw new RuntimeException(“无法获取连接”, e);}}(String[] args) throws SQLException {for(int i = 0; i < 10; i++) {long begintime = System.currentTimeMillis();Connection con = null;try {//取得空闲连接con = dbPoll.getInstance().getConnection();PreparedStatement pst = con.prepareStatement(“SELECT * from UserInfo”);ResultSet rs = pst.executeQuery();//输出查询结果while (rs.next()) {System.out.println(rs.getObject(1) + ” ” + rs.getObject(2) + ” ” + rs.getObject(3) + ” ” + rs.getObject(4));}} catch (Exception e) {e.printStackTrace();} finally {if (con != null) {//归还空闲连接con.close();}}long endtime = System.currentTimeMillis();System.out.println((i+1) + ” time is:” + (endtime-begintime));}}}

从代码我们可以和清晰的看出连接池的使用是非常简单的,代码中我将连接池的配置等信息写到了构造函数中,其实现实中使用我们一般写在c3p0-config.xml,数据库连接池的配置文件中,然后放到src目录下即可。 连接池的使用步骤和普通的JDBC连接数据库基本一样。参数也类似 只不过部分含义不同,连接池的connection,并不是创建连接,而是从数据库连接池中间找出一个空闲的连接,con.close()也不是断开连接,而是归还给连接池。 还有注意我们不仅仅要归还connection资源,还要归还Preparedstatement和ResultSet的资源 我们也需要养成良好的习惯使用Preparedstatement而不是statement,因为Preparedstatement里面包含了部分已经编译好的sql语句,可以提高执行速度。

5.最优连接池配置选择

使用和使用好两个词是截然不同的,我们的目的不仅仅是使用线程池或者数据库连接池,而是通过使用它们来发挥服务器最大威力以及效率达到最优。 这就要我们根据自己服务器配置信息来选择参数了~。 先看看代码中我们设定了哪些参数。

设置初始化连接池大小 dbSource.setInitialPoolSize(1);

设置连接池内最小连接数 dbSource.setMinPoolSize(2);

设置连接池内最大连接数 dbSource.setMaxPoolSize(10);

用来控制Preparedstatement的数量 dbSource.setMaxStatements(50);

最大空闲时间,60秒内未使用连接则被丢取,设置为0则永不丢弃 dbSource.setMaxIdleTime(60); 以上为常用和关键的参数。

关于最关键的参数设定 1.最小连接数 连接池一直保持的数据库连接。最小连接数的大小我们要根据实际的使用情况不断的测试来决定,如果设定大了就会有许多空闲的连接,浪费了资源。

人生的失败往往是在关键时刻少了坚持。

浅析数据库连接池(二)

相关文章:

你感兴趣的文章:

标签云: