数据库连接池
时间:2022-09-25 15:30:00
数据库连接池
概念
之所以使用数据库连接池,是因为传统的连接方法是每次数据库操作都要创建新的连接,并在操作结束后释放连接。非常浪费资源,效率低下。使用连接池技术可以一次创建多个连接,直接从池中获取连接。
连接池实际上是一个存储数据库连接的容器(集合)。当系统初始化时,容器创建,容器将申请一些连接对象。当用户访问数据库时,他们将从容器中获得连接对象。用户访问后,连接对象将归还给容器。
数据库连接池的优点
- 节约资源
- 高效
实现数据库连接池
-
标准接口: DataSource javax.sql包下的
1.方法:
- 获取连接(getConnection())
- 返回连接(如果连接对象是从连接池中获得的,则直接调用connection.close()将连接返回数据连接池而不是关闭连接)
2.一般数据库连接池不需要自己实现,数据库制造商已经实现了
-
C3P0:数据库连接池技术比较老
-
Druid:阿里巴巴提供的数据库连接池技术,非常优秀的数据库连接池技术
C3P0的使用
-
导入jar包
c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.12.jar
-
配置文件
名称:c3p0.properties或者c3p0-config.xml 路径:将文件直接放置src目录下即可
分析配置文件 c3p0-config.xml
<c3p0-config> <default-config> <named-config name="default">named-config> <property name="driverClass">com.mysql.jdbc.Driverproperty> <property name="jdbcUrl">jdbc:mysql://localhost:3306/sql_storeproperty> <property name="user">rootproperty> <property name="password">smt020528property> <property name="initialPoolSize">5property>
<property name="maxPoolSize">10property>
<property name="checkoutTimeout">3000property>
default-config>
<named-config name="otherc3p0">
<property name="driverClass">com.mysql.jdbc.Driverproperty>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25property>
<property name="user">rootproperty>
<property name="password">rootproperty>
<property name="initialPoolSize">5property>
<property name="maxPoolSize">8property>
<property name="checkoutTimeout">1000property>
named-config>
c3p0-config>
注意:其中的
<default-config>
<named-config name="default">named-config>
这一部分在官方下载的初始配置文件中是没有的,由于在实际中可能会创建不止一个连接池,呢么就需要给不同的连接池加以区分,最好的方法就是添加name。
DataSource dataSource=new ComboPooledDataSource();
想要使用哪个连接池,就在这个构造方法中传递哪个连接池配置文件中的name值即可。
-
创建核心对象 数据库连接池对象 ComblPooledDataSource
-
创建连接:getConnection
代码
package 连接池.C3P0;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.*;
public class Pool_Demo2 {
public static void main(String[] args) {
DataSource dataSource = new ComboPooledDataSource("default");
try {
Connection connection = dataSource.getConnection();
Statement statement = null;
ResultSet resultSet=null;
String sql_statement = "select * from customers";
statement=connection.prepareStatement(sql_statement);
resultSet=statement.executeQuery(sql_statement);
while(resultSet.next()){
String customer_id=resultSet.getString(1);
String first_name=resultSet.getString(2);
String last_name=resultSet.getString(3);
String birth_date=resultSet.getString(4);
String phone=resultSet.getString(5);
String addrtess=resultSet.getString(6);
String city=resultSet.getString(7);
String state=resultSet.getString(8);
String points=resultSet.getString(9);
System.out.println(customer_id+" "+first_name+" "+last_name+""+birth_date
+" "+birth_date+" "+phone+" "+addrtess+" "+city+" "+state+" "+points);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Druid的使用
Druid是阿里开发的,非常优秀
-
导入jar包
druid-1.0.9.jar
-
配置文件
该配置文件是properties文件 可以叫任意名称
配置文件解析
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/sql_store
username=root
password=******** //数据库密码
initialSize=5 //初始化的默认连即数
maxActive=10 //最大连接数
maxWait=3000 //最大等待时间
//如果在使用该连接池进行连接出现该错误:testWhileIdle is true, validationQuery not set,在
//配置文件中添加下面的配置即可。初始的配置文件中是没有下面的信息的。
timeBetweenEvictionRunsMillis=60000
minEvictableIdleTimeMillis=300000
validationQuery=SELECT 1
testWhileIdle=true
testOnBorrow=false
testOnReturn=false
poolPreparedStatements=false
maxPoolPreparedStatementPerConnectionSize=200
- 获取数据库连接对象
Properties properties=new Properties();
InputStream is=Druid_Demo.class.getClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
//获取池连接对象
DataSource dataSource=DruidDataSourceFactory.createDataSource(properties);
Connection connection=dataSource.getConnection();
System.out.println(connection);