一、Java中数据库连接池的基本介绍
数据库连接池的示意图
二、数据库连接池的种类
三、C3P0数据库连接池的使用,代码如下
public class C3P0_ {
//1.方式1:相关参数,在程序中指定user,url,password等
@Test
public void testC3P0_01() throws Exception {
//1.创建一个数据源对象
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
//2.通过配置mysql.properties获取相关连接信息
//通过Properties,获取相关配置文件的信息
Properties properties = new Properties();
properties.load(new FileInputStream("src\\mysql.properties"));
//获取相关的值
String user = properties.getProperty("user");
String password = properties.getProperty("password");
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
//给数据源comboPooledDataSource设置相关的参数
//注意:连接管理是由comboPooledDataSource来管理
comboPooledDataSource.setDriverClass(driver);
comboPooledDataSource.setJdbcUrl(url);
comboPooledDataSource.setUser(user);
comboPooledDataSource.setPassword(password);
//初始化连接数
comboPooledDataSource.setInitialPoolSize(10);
//设置最大连接数
comboPooledDataSource.setMaxPoolSize(50);
//测试连接池的效率,测试对mysql 5000次操作
long start = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
Connection connection = comboPooledDataSource.getConnection();//这个方法就是从DataSource接口实现的
connection.close();
}
long end = System.currentTimeMillis();
System.out.println("C3P0 5000次连接mysql耗时:" + (end - start));//C3P0 5000次连接mysql耗时:1038
}
//第二种方式,使用配置文件模板来完成
//1.将c3p0提供的 拷贝到src目录下
//2.该文件指定了连接数据库和连接池的相关参数
@Test
public void testC3P0_02() throws Exception {
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("ly_edu");
//测试5000次连接mysql
long start=System.currentTimeMillis();
System.out.println("开始执行");
for (int i = 0; i < 5000; i++) {
Connection connection = comboPooledDataSource.getConnection();
connection.close();
}
long end=System.currentTimeMillis();
System.out.println("C3P0 5000次连接mysql耗时:" + (end - start));//C3P0 5000次连接mysql耗时:1026
}
}
第二种方式需要使用配置模板来完成,将c3p0-config.xml拷贝到src目录下,就可以使用了,c3p0-config.xml代码如下
<c3p0-config>
<!--数据库源名称代表连接池-->
<named-config name="ly_edu">
<!-- 使用默认的配置读取连接池对象-->
<!-- 连接参数 -->
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db_ly?serverTimezone=GMT</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 连接池参数 -->
<!--每次增长的连接数-->
<property name="acquireIncrement">5</property>
<!-- 初始连接数 -->
<property name="initialPoolSize">10</property>
<!--最小连接数-->
<property name="minPoolSize">5</property>
<!-- 最大连接数 -->
<property name="maxPoolSize">10</property>
<!--可连接的最多的命令对象数-->
<property name="maxStatements">5</property>
<!--每个连接对象可连接的最多的命令对象数-->
<property name="maxStatementsPerConnection">2</property>
</named-config>
</c3p0-config>
四、德鲁伊(Druid)数据库连接池的使用,代码如下
public class Druid_ {
@Test
public void testDruid() throws Exception {
//1.加入Druid jar包
//2.加入配置文件,将该文件拷贝到项目的src目录下
//3.创建Properties对象,读取配置文件
Properties properties = new Properties();
properties.load(new FileInputStream("src\\druid.properties"));
//4.创建一个指定参数的数据库连接池
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
long start =System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
Connection connection = dataSource.getConnection();
connection.close();
}
long end =System.currentTimeMillis();
System.out.println("Druid 5000次连接mysql耗时:" + (end - start));//Druid 5000次连接mysql耗时:3608
}
}
五、将 Java 中封装JDBC连接到JDBCUtils工具类的详解 这边文章中的JDBCUtils工具类,更新为通过Druid数据库连接池得到连接和关闭资源。
JDBCUtilsByDruid工具类代码如下
//基于druid数据库连接池的工具类
public class JDBCUtilsByDruid {
private static DataSource ds;
//在静态代码块完成 ds初始化
static {
try {
Properties properties = new Properties();
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 statement, Connection connection) {
try {
if (resultSet != null) {
resultSet.close();
}
if (statement != null) {
statement.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
JDBCUtilsByDruid工具类的使用
public class JDBCUtilsByDruid_Use {
@Test
public void testSelect() {
Connection connection = null;
String sql = "SELECT id,name,borndate FROM ACTOR WHERE id = ?";
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//1.得到连接
connection = JDBCUtilsByDruid.getConnection();
System.out.println(connection.getClass());//class com.alibaba.druid.pool.DruidPooledConnection
preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1, 2);
//执行得到结果集
resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String name = resultSet.getString("name");
int id = resultSet.getInt("id");
Date borndate = resultSet.getDate("borndate");
System.out.println(id + "\t" + name + "\t" + borndate);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtilsByDruid.close(resultSet, preparedStatement, connection);
}
}
}
输出结果如下
class com.alibaba.druid.pool.DruidPooledConnection
2 王宝强 1980-01-03
|