数据库连接池的概念:
数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
这里讲了两个常用的数据库连接池(可以理解为节约资源的容器,避免了重复申请数据库连接),以及Spring框架对JDBC简单封装后的JDBCTemplate对象(使得JDBC的操作大大简化)。
c3p0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。
这两个c3p0的依赖jar包:
<!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.20</version>
</dependency>
最重要的是不能忘记导入驱动jar包:
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
这里注意修改成和自己匹配的项就行了。
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/root</property>
<property name="user">root</property>
<property name="password">123456</property>
<!-- 连接池参数 -->
<!--初始化申请的连接数量-->
<property name="initialPoolSize">5</property>
<!--最大的连接数量-->
<property name="maxPoolSize">10</property>
<!--超时时间-->
<property name="checkoutTimeout">3000</property>
</default-config>
<named-config name="other_c3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/other_db</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">8</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
获取conn后,后续操作跟jdbc一样。
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Demo {
public static void main(String[] args) {
//创建数据库连接池对象
DataSource ds = new ComboPooledDataSource();
//获取连接对象
Connection conn = null;
try {
conn = ds.getConnection();
} catch (SQLException exception) {
exception.printStackTrace();
}
//打印
System.out.println(conn);
}
}
使用maven时候要注意把配置文件放在resources目录下。
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql:///root
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 最大等待时间
maxWait=3000
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
public class DruidDemo {
public static void main(String[] args) {
//加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
try {
pro.load(is);
//获取连接池对象
DataSource ds = DruidDataSourceFactory.createDataSource(pro);
//获取连接
Connection conn = ds.getConnection();
System.out.println(conn);
} catch (IOException exception) {
exception.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
定义一个JDBCUtils类,提供静态代码块加载配置文件,初始化连接池对象,提供以下方法:
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class JDBCUtils {
//定义成员变量
private static DataSource ds;
static {
try {
//加载配置文件
Properties pro = new Properties();
InputStream is = DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
//获取连接池对象
ds = DruidDataSourceFactory.createDataSource(pro);
} catch (SQLException exception) {
exception.printStackTrace();
} catch (IOException exception) {
exception.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
/** * 获取连接 * @return */
public static Connection getConnection() throws SQLException {
//获取连接
return ds.getConnection();
}
/** * 释放资源 * @param stmt * @param conn */
public static void close(Statement stmt,Connection conn){
if(stmt!=null){
try {
stmt.close();
} catch (SQLException exception) {
exception.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException exception) {
exception.printStackTrace();
}
}
}
/** * 重载 * @param rs * @param stmt * @param conn */
public static void close(ResultSet rs,Statement stmt, Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException exception) {
exception.printStackTrace();
}
}
close(stmt,conn);
}
public static DataSource getDataSource(){
return ds;
}
}
一个简单的demo,演示了对JDBCUtils工具类的使用。
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DruidDemo2 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
//获取连接
try{
//获取连接
conn = JDBCUtils.getConnection();
//定义sql
String sql = "insert into user values (null ,?,?)";
//获取pstmt对象
pstmt = conn.prepareStatement(sql);
//赋值
pstmt.setString(1,"h");
pstmt.setString(2,"yh");
//执行sql
int count = pstmt.executeUpdate();
System.out.println(count);
} catch (SQLException exception) {
exception.printStackTrace();
}finally {
JDBCUtils.close(pstmt,conn);
}
}
}
Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发。
使用JdbcTemplate的方法来完成增删改查:
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>mchange-commons-java</artifactId>
<version>0.2.20</version>
</dependency>
一个简单的demo,可以看出以及简化了很多代码并且不需要我们去手动释放资源,非常方便。
import org.springframework.jdbc.core.JdbcTemplate;
public class Demo {
public static void main(String[] args) {
//创建对象
JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
//定义sql
String sql = "update user set password = 'password' where id = ?";
//调用方法
int count = template.update(sql,3);
System.out.println(count);
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_50216270/article/details/117223464
内容来源于网络,如有侵权,请联系作者删除!