Java数据库连接池之DBCP浅析
什么是数据库连接池
数据库连接池是数据库连接对象的一个容器。在程序初始化时,容器被创建,并装入足够的连接对象,在程序运行过程中,系统将连接对象放入容器中,并从容器中取出连接对象,使用完毕后再将连接对象放回容器中。
其中,连接对象是指一个数据库连接。对于Java来说,主流的数据库连接方式有两种,一种是JDBC(Java数据库连接),一种是Hibernate(ORM框架),而这两种连接方式又都涉及到数据库连接的创建和关闭。当JDBC程序频繁访问数据库时,便会频繁地创建和关闭数据库连接,这样的高频率操作对数据库造成很大的负担,(连接的建立和撤消会消耗极其宝贵的系统资源,如数据库内部锁(metadata locks),TCP/IP连接,网络通信等,所以对于频繁使用数据库操作的应用,为了提高性能,就应该利用连接池技术来管理这些连接) 因此连接池技术应运而生,它能够在系统初始化时建立足够导的连接,不同的请求可以从连接池中获取连接对象,使用完毕后又将连接放回连接池中,从而避免了频繁地创建和关闭数据库连接,提高了系统的性能。
DBCP连接池
DBCP是Apache Common提供的连接池。它提供了一种方式来管理您的引用JDBC连接。同样作为commons-pool的一部分,您可以使用DBCP轻松地创建一个池来管理任意对象。
配置与创建
在使用DBCP连接池之前,我们需要在程序中引入DBCP的依赖,同时定义连接池的配置信息。具体方式如下:
pom.xml
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
connectionPool.xml
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${driverClassName}"/>
<property name="url" value="${jdbcUrl}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
<property name="initialSize" value="${initialSize}"/>
<property name="maxActive" value="${maxActive}"/>
<property name="maxIdle" value="${maxIdle}"/>
<property name="maxWait" value="${maxWait}"/>
</bean>
上面的xml中,配置了最基本的几个连接池参数:
- driverClassName:JDBC Driver的驱动程序类名
- url:数据库连接地址
- username:数据库用户名
- password:数据库密码
- initialSize:初始化连接池数量
- maxActive:连接池允许的最大活动连接数量
- maxIdle:最大空闲连接数
- maxWait:当连接池中连接存放满后,新的连接请求等待的时间,单位毫秒。
在我们的程序中,我们可以使用Spring的依赖注入技术,在需要连接的位置引用名为dataSource的连接池,这样我们便可以使用连接池中的连接进行操作了。如下:
@Autowired
private DataSource dataSource;
使用示例
下面我们实际编写一个使用DBCP连接池进行操作的示例,示例中我们使用的是MySQL数据库。
首先,我们需要在pom.xml文件中引入MySQL驱动的依赖,如下:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.18</version>
</dependency>
接下来我们通过一个Dao类来实现对数据库的增删改查操作,如下:
@Repository
public class UserDao {
private JdbcTemplate jdbcTemplate;
@Autowired
public void setDataSource(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
public void addUser(String name, String password) {
String sql = "INSERT INTO users(name, password) VALUES(?,?)";
jdbcTemplate.update(sql, name, password);
}
public void deleteUser(String name) {
String sql = "DELETE FROM users WHERE name = ?";
jdbcTemplate.update(sql, name);
}
public void updateUser(String name, String password) {
String sql = "UPDATE users SET password =? WHERE name = ?";
jdbcTemplate.update(sql, password, name);
}
public List<User> getUsers() {
String sql = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet resultSet, int i) throws SQLException {
User user = new User();
user.setName(resultSet.getString("name"));
user.setPassword(resultSet.getString("password"));
return user;
}
});
return users;
}
}
在上面的Dao中,我们使用了Spring的JdbcTemplate,它是一个JDBC通用的DAO操作工具类,它提供了很多常用数据库操作的API,使用起来很方便。为了使用DBCP连接池,我们在Dao中注入了名为dataSource的连接池,这样JdbcTemplate在进行数据库操作的时候就会自动使用连接池中的连接。
最后,我们可以通过一个Service层来调用Dao的相关方法,如下:
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void addUser(String name, String password) {
userDao.addUser(name, password);
}
public void deleteUser(String name) {
userDao.deleteUser(name);
}
public void updateUser(String name, String password) {
userDao.updateUser(name, password);
}
public List<User> getUsers() {
return userDao.getUsers();
}
}
在这个示例中,我们使用了DBCP连接池来对MySQL数据库进行增删改查操作。其中,连接池的配置信息在程序启动时读取,连接池的初始化和销毁由程序自动管理。在具体的操作中,我们使用了Spring的IOC容器和JdbcTemplate,连接池的使用对于我们的程序来说是透明的。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java数据库连接池之DBCP浅析_动力节点Java学院整理 - Python技术站