背景:
每次使用SQL语句操作数据库时,需要与数据库建立连接,然后在使用后销毁连接。这种频繁的创建和销毁消耗了机器的性能和资源,这意义不大。数据库连接可以解决这个问题。
注:建立数据库连接是一件非常耗时(耗时)和耗力(消耗资源)的事情。这是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(如连接或命名管道),第一次与服务器握手,分析连接字符串信息,服务器验证连接、运行检查在当前事务中注册等。
什么是数据库连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池做了什么?
数据库连接池是存储数据库连接的容器(集合)。 1.当系统初始化时,容器创建,一些连接对象将在容器中申请/存储, 2.当用户访问数据库(需要连接数据库)时,他们可以从池/容器中获接对象,而不是建立新的连接 3.用户访问后,将连接对象返回容器。 注1:在整个过程中,这些连接不会关闭,而是不断回收,从而节省了启动和关闭连接的时间。()
快速入门:
1、导入jar包【druid】
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.8</version> </dependency>
2、创建druid.properties配置文件(resoureces目录下)
driverClassName=com.mysql.cj.jdbc.Driver #URL连接数据库URL,其中travel(以下例子)作为连接的数据库,面的参数不能更改,但不能删除 url=jdbc:mysql://localhost:3306/test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC characterEncoding=utf-8 #安装mysql当设置用户和密码时 username=root password=123456 ##初始物理连接的数量 initialSize=5 #最大连接池数量 maxActive=10 #获得连接时最大等待时间 maxWait=3000 ##用于检测连接是否有效sql validationQuery=SELECT 1 #确保安全! testWhileIdle=true
3、代码实现
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.util.Properties; public class DruidTest {
public static void main(String[] args) throws Exception {
/**1、加载配置文件 * a)创建Properties类对象 *说明:Properties(Java.util.Properties),该类主要用于读取Java的配置文件 * b)通过反射获取类加载器-加载文件(获得输入流) * c)读取文件 */ Properties pro = new Properties(); InputStream is = DruidTest.class.getClassLoader().getResourceAsStream("druid.properties"); pro.load(is); //2、获取连接池对象 DataSource dataSource = DruidDataSourceFactory.createDataSource(pro); //3、获取连接 Connection connection = dataSource.getConnection(); System.out.println(connection); //4、归还连接(不是销毁而是还给连接池) connection.close(); } }
优点:节约资源,高效 数据库连接:容器提供连接,使用完毕后归还连接,等待下一次使用 但是,每次使用都自己需要手动向连接池申请连接、需要自己手动归还资源。 我们可以使用JDBCTemplate(模板)来自动帮我们,为你提供了一些关于sql语句的方法。
Druid连接池定义工具类
实现功能:
- 1、自动注册驱动、自动给参数赋值(URl定位配置文件)
- 2、提供连接数据库连接方法(static已经赋值了配置文件的参数)
- 3、提供释放资源方法——close
这里是引用
//1. 抽取注册驱动的代码 (使用静态代码块)
private static String driver;
private static String url;
private static String user;
private static String password;
static{
try{
//(URL,USER,PASSWORD,DRIVER是需要修改的内容,可以都放入配置文件内,然后将配置文件放在**src**文件下)
//1. 创建Properties对象
Properties pro = new Properties();
//2. 加载配置文件
ClassLoader cl = JDBCUTils.class.getClassLoader();
InputStream is=cl.getResourceAsStream("jdbc.properties");
pro.load(is);
//3. 获取数据并赋值
//注意:key值都要和配置文件的一一对应
url = pro.getProperty("url");
user = pro.getProperty("user");
password = pro.getProperty("password");
driver = pro.getProperty("driver");
//4. 替换数据
/*将“com.mysql.jdbc.Driver”替换为driver; 将“jdbc:mysql://localhost:3306/myjdbc”替换为url; 将”root”替换为user; 将”root”替换为password;*/
Class.forName("com.mysql.jdbc.Driver");
}catch(SQLException e){
e.printStackTrace();
}
}
//2. 抽取获取连接对象的方法
public static Connection getConnection(){
return DriverManager.getConnection("jdbc:mysql://localhost:3306/myjdbc","root","密码")
}
//3. 抽取释放资源的方法
public static void close(Connection conn,Statement stmt){
if(stmt != null){
try{
stmt.close();
}catch(SQLException e){
e.printStackTrace();
}
}
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
}
public static void close(ResultSet rs,Connection conn,Statement stmt){
if(conn != null){
try{
conn.close();
}catch(SQLException e){
e.printStackTrace();
}
}
close(conn,stmt);
}
java连接数据库专栏文章:
java连接数据库(一):JDBC
Java连接数据库(二):数据库连接池(druid)
java连接数据库(三):Spring JDBC/JDBC Template
java连接数据库(4.1):Mybatis框架快速入门
java连接数据库(4.2):Mybatis框架注解的简单使用