数据库连接池
概念
之所以使用数据库连接池,是因为之前传统的连接方法是每进行一次数据库操作都要创建一个新的连接,并且在操作结束后又将连接释放。非常的浪费资源,效率低下。使用连接池技术就能一次性创建多个连接,使用的时候直接从池子中获取连接就行。
连接池实际就是一个容器(集合),其中存放着数据库连接,当系统初始化好后,容器被创建,容器会申请一些连接对象,当用户访问数据库的时候,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
数据库连接池的优点
- 节约资源
- 高效
数据库连接池的实现
-
标准接口: 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> <!--在使用C3P0获取连接的时候,只要传递这里的名字就行-->
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/sql_store</property>
<property name="user">root</property>
<property name="password">smt020528</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property> <!--初始化申请的连接数量-->
<property name="maxPoolSize">10</property> <!--最大池容量-->
<property name="checkoutTimeout">3000</property> <!--超时时间-->
</default-config>
<named-config name="otherc3p0">
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/day25</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>
注意:其中的
<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);