day48-JDBC和连接池04( 三 )

c3p0的第二种方式 5000次连接mysql 耗时=533ms

day48-JDBC和连接池04

文章插图
10.4德鲁伊连接池首先将Druid的jar包复制到项目的lib文件夹中,点击右键,选择add as library
day48-JDBC和连接池04

文章插图
jar包在该网站可以下载 Central Repository: com/alibaba/druid (maven.org)
然后将提供的配置文件的druid.properties(文件名可以随意)复制到src目录下
druid.properties:
#key=valuedriverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/hsp_02?rewriteBatchedStatements=true#url=jdbc:mysql://localhost:3306/hsp_02username=rootpassword=123456#initial connection SizeinitialSize=10#min idle connecton sizeminIdle=5#max active connection sizemaxActive=50#max wait time (5000 mil seconds) 在等待队列中的最大等待时间maxWait=5000测试程序:
package li.jdbc.datasource;import com.alibaba.druid.pool.DruidDataSourceFactory;import org.junit.Test;import javax.sql.DataSource;import java.io.FileInputStream;import java.sql.Connection;import java.util.Properties;/** * 测试德鲁伊Druid的使用 */public class Druid_ {@Testpublic void testDruid() throws Exception {//1.加入Druid包//2.加入配置文件 druid.properties,将该文件复制到项目的src目录下面//3.创建Properties对象,读取配置文件Properties properties = new Properties();properties.load(new FileInputStream("src\\druid.properties"));//4.创建一个指定参数的数据库连接池,Druid连接池DataSource dataSource =DruidDataSourceFactory.createDataSource(properties);long start = System.currentTimeMillis();for (int i = 0; i < 5000; i++) {Connection connection = dataSource.getConnection();//System.out.println("连接成功!");connection.close();}long end = System.currentTimeMillis();System.out.println("Druid连接池 操作5000次耗时="+(end-start));}}德鲁伊连接池操作5000次的总耗时为434ms
day48-JDBC和连接池04

文章插图
5000次连接池的时间和c3p0的时间差不多,但是当连接数量到50万、500万时差距就会很明显,因此在实际开发中推荐使用Druid连接池 。
10.4.1德鲁伊工具类将之前7.1的JDBCUtils工具类改为Druid(德鲁伊)实现
通过德鲁伊数据库连接池获取连接对象
工具类:JDBCUtilsByDruid
package li.jdbc.datasource;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;import java.io.FileInputStream;import java.sql.Connection;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;import java.util.Properties;/** * 基于Druid数据库连接池的工具类 */public class JDBCUtilsByDruid {private static DataSource ds;//在静态代码块完成ds的初始化//静态代码块在加载类的时候只会执行一次,因此数据源也只会初始化一次static {Properties properties = new Properties();try {properties.load(new FileInputStream("src\\druid.properties"));ds = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//编写getConnection方法public static Connection getConnection() throws SQLException {return ds.getConnection();}//关闭连接(注意:在数据库连接池技术中,close不是真的关闭连接,而是将Connection对象放回连接池中)public static void close(ResultSet resultSet, Statement statemenat, Connection connection) {try {if (resultSet != null) {resultSet.close();}if (statemenat != null) {statemenat.close();}if (connection != null) {connection.close();}} catch (SQLException e) {throw new RuntimeException(e);}}}测试程序:JDBCUtilsByDruid_Use
package li.jdbc.datasource;import org.junit.Test;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Date;public class JDBCUtilsByDruid_Use {@Testpublic void testSelect() {System.out.println("使用druid方式完成");//1.得到连接Connection connection = null;//2.组织一个sql语句String sql = "Select * from actor where id >=?";//3.创建PreparedStatement对象PreparedStatement preparedStatement = null;ResultSet set = null;try {connection = JDBCUtilsByDruid.getConnection();/*** Connection是个接口,是由sun公司定义的规范,根据Connection的实现类不同,close方法也不同* mysql的厂商的实现类是直接把连接关闭,Alibaba的实现是将引用的连接放回到连接池等待下一次引用* 因此在Druid中的close方法并不是真正地关闭连接*/System.out.println(connection.getClass());//运行类型 class com.alibaba.druid.pool.DruidPooledConnectionpreparedStatement = connection.prepareStatement(sql);preparedStatement.setInt(1, 1);//给?号赋值//执行sql,得到结果集set = preparedStatement.executeQuery();//遍历该结果集while (set.next()) {int id = set.getInt("id");String name = set.getString("name");String sex = set.getString("sex");Date borndate = set.getDate("borndate");String phone = set.getString("phone");System.out.println(id + "\t" + name + "\t" + sex + "\t" + borndate + "\t" + phone);}} catch (SQLException e) {e.printStackTrace();} finally {//关闭资源(不是真的关闭连接,而是将Connection对象放回连接池中)JDBCUtilsByDruid.close(set, preparedStatement, connection);}}}

经验总结扩展阅读