二十三、JDBC使用连接池

1.通过JDBC使用c3p0连接池

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展 。目前使用它的开源项目有Hibernate、Spring等

例如:

1)创建数据库表(存储学生登陆信息表)

create table t_user(
    stu_id int primary key auto_increment,
    stu_username varchar(20),
    stu_password varchar(20)
)

2)创建数据库对应的实例类

一个类对应一个实例类

public class StudentBean {
	private int stuId;
	private String uername;
	private String password;
	public StudentBean(int stuId,String uername, String password) {
		this.stuId = stuId;
		this.uername = uername;
		this.password = password;
	}
	public int getStuId() {
		return stuId;
	}
	public void setStuId(int stuId) {
		this.stuId = stuId;
	}
	public String getUername() {
		return uername;
	}
	public void setUername(String uername) {
		this.uername = uername;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

3)导入依赖包

c3p0-0.9.5.2.jar

mchange-commons-java-0.2.15.jar

mysql-connector-java-5.1.38.jar

4)在scr下创建c3p0配置文件

文件名(c3p0-config.xml)不能更改规定死的

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
	<!-- c3p0的默认配置项   -->
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="initialPoolSize">5</property>
		<property name="maxPoolSize">20</property>
	</default-config>
	
	<!-- 定义数据库配置 -->
	<named-config name="test">
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://localhost:3306/studentserver</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="initialPoolSize">25</property>
		<property name="maxPoolSize">100</property>
	</named-config>
</c3p0-config>

5)创建数据库访问类

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import com.mchange.v2.c3p0.ComboPooledDataSource;


public class DAOConnection {
	//保存c3p0数据源对象
	private ComboPooledDataSource dataSource;
	public DAOConnection(){
		//初始化数据源
		dataSource = new ComboPooledDataSource();
		//dataSource= new ComboPooledDataSource("test");
	}
	//添加账号密码
	public boolean inserUser(StudentBean stu){
		boolean flag = false;
		try {
			Connection conn = dataSource.getConnection();
			String sql = "insert into t_user values(null,?,?)";
			PreparedStatement ps = conn.prepareStatement(sql);
			ps.setString(1, stu.getUername());
			ps.setString(2, stu.getPassword());
			int i = ps.executeUpdate();
			ps.close();
			conn.close();
			if (i>0) {
				flag = true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("未完成链接");
			e.printStackTrace();
		}
		return flag;
	}
	
}

C3P0的优点: 

不用手动编写创建数据库连接对象的操作,因为c3p0的数据库连接池的配置中已经配置初始化成功。提高程序的执行效率。 日后切换数据库的时候不需要修改源代码,只需要修改c3p0的数据库连接池的配置。

2.通过JDBC使用DBCP连接池

数据库连接池负责分配、管理和释放数据库链接,它允许应用程序重复使用一个现有的数据库连接,而不是在重新建立一个;释放空闲事件超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。技术能明显提高数据库的操作性能。

 1)创建数据库表(存储学生登陆信息表)

create table t_user(
    stu_id int primary key auto_increment,
    stu_username varchar(20),
    stu_password varchar(20)
)

2)创建java项目导入jar包

commons-dbcp-1.4.jar

commons-dbutils-1.6.jar

commons-pool-1.6.jar

3)在src下创建数据库连接配置文件

命名规则:【xxxxxxxx.properties】

properties配置内容 

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root

maxActive=50
maxIdle=20
maxWait=60000

4)创建数据库对应的实例类

package dbcp;

public class UserloginInfo {
	private int stuId;
	private String username;
	private String password;
	public UserloginInfo(int stuId, String username,String password) {
		this.stuId = stuId;
		this.username = username;
		this.password = password;
	}
	public int getStuId() {
		return stuId;
	}
	public void setStuId(int stuId) {
		this.stuId = stuId;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

5)创建数据库访问类

package dbcp;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSourceFactory;

public class DOAcontrol {
	private DataSource dataSource=null;
	public DOAcontrol(){
		try {
			Properties properties = new Properties();
			InputStream in = this.getClass().getResourceAsStream("/logininfo.properties");
			properties.load(in);
			dataSource = BasicDataSourceFactory.createDataSource(properties);
		} catch (Exception e) {
			// 连接错误
			e.printStackTrace();
		}
	}
	//添加用户信息
	public boolean insertinfo(UserloginInfo userloginInfo){
		boolean flag = false;
		try {
			Connection con = dataSource.getConnection();
			String sql = "insert into t_user values(null,?,?)";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, userloginInfo.getUsername());
			ps.setString(2, userloginInfo.getPassword());
			int i = ps.executeUpdate();
			if (i>0) {
				flag = true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return flag;
	}
}

3.通过JDBC使用Druid

Druid首先是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池!

同时Druid不仅仅是一个数据库连接池,它包括四个部分:

Druid是一个JDBC组件,它包括三个部分:

基于Filter-Chain模式的插件体系。

DruidDataSource 高效可管理的数据库连接池。

SQLParser

Druid的功能:

1、替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。

2、可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。

3、数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback。

4、SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。

5、扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件。

所以Druid可以:
1、充当数据库连接池。
2、可以监控数据库访问性能
3、获得SQL执行日志

例子:

  1)创建数据库表(存储学生登陆信息表)

create table t_user(
    stu_id int primary key auto_increment,
    stu_username varchar(20),
    stu_password varchar(20)
)

2)创建java项目,导入jar包

druid-1.1.10.jar

3)在src下创建数据库连接配置文件

命名规则 : xxxxxxxx.properties

配置内容:

driverClassName=com.mysql.jdbc.Driver

url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8

username=root

password=123456

initialSize=100

maxActive=300

maxWait=60000

Druid配置详解

DRUID连接池的实用 配置详解_zhangjinwei417的博客-CSDN博客_druid连接池配置

4)创建数据库对应的实例类

一个数据库表对应有一个实例类

package druid;

public class UserloginInfo {
	private int stuId;
	private String username;
	private String password;
	public UserloginInfo(int stuId, String username,String password) {
		this.stuId = stuId;
		this.username = username;
		this.password = password;
	}
	public int getStuId() {
		return stuId;
	}
	public void setStuId(int stuId) {
		this.stuId = stuId;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

5) 创建数据库访问类

package druid;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Properties;

import javax.sql.DataSource;

import com.alibaba.druid.pool.DruidDataSourceFactory;

public class DOAcontrol {
	private DataSource dataSource=null;
	public DOAcontrol(){
		try {
			Properties properties = new Properties();
			InputStream in = this.getClass().getResourceAsStream("/logininfo.properties");
			properties.load(in);
			dataSource = DruidDataSourceFactory.createDataSource(properties);
		} catch (Exception e) {
			// 连接错误
			e.printStackTrace();
		}
	}
	//添加用户信息
	public boolean insertinfo(UserloginInfo userloginInfo){
		boolean flag = false;
		try {
			Connection con = dataSource.getConnection();
			String sql = "update t_user set stu_username=?,stu_password=? where stu_id=?";
			PreparedStatement ps = con.prepareStatement(sql);
			ps.setString(1, userloginInfo.getUsername());
			ps.setString(2, userloginInfo.getPassword());
			ps.setInt(3, userloginInfo.getStuId());
			int i = ps.executeUpdate();
			if (i>0) {
				flag = true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return flag;
	}
}

 

无奈源于不够强大

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值