概述
数据库连接池
享元模式
- connection是Java和数据库两个平行系统的桥梁
- 桥梁构建不易,成本很高,单次使用成本昂贵
- 运用共享技术来实现数据库连接池(享元模式)
- 降低系统中数据库连接connection对象的数量
- 降低数据库服务器的连接响应速度
- 提高Connection获取的响应速度
常用的数据库连接池实现技术
- C3P0
- Druid(阿里)
注意:连接池对象仍然使用完连接后仍然要释放资源
eg:
C3P0两种使用方式
- 硬编码方式(不推荐)
- 配置文件
- 名称:c3p0.properties或者c3p0-config.xml
- 路径:直接将文件放在src目录下
C3P0步骤:
- 导入jar包(两个):c3p0-0.9.5.2.jar,mchange-commons-java-0.2.12.jar,不要忘记导入mysql驱动jar包
- 定义配置文件
- c3p0-config.xml
- 路径:直接将文件放在src目录下
- 创建核心对象:数据库连接池对象 DataSource ds=new ComboPooledDataSource();
- 获取连接
Druid步骤:
- 导入jar包(一个):druid-1.2.3.jar
- 定义配置文件
- druid.properties
- 可以叫任意名称,可以放在任意路径
- 加载配置文件
- 获取数据库连接池对象 通过工厂类来获取
- 获取连接
//从c3p0获取
//conn = C3p0Factory1.getConnection();
//conn = C3p0Factory2.getConnection();
//从Druid获取
//conn = DruidFactory1.getConnection();
conn = DruidFactory2.getConnection();
C3p0Factory1
public class C3p0Factory1 {
private static ComboPooledDataSource dataSource = null;
public static void init() throws Exception {
dataSource = new ComboPooledDataSource();
dataSource.setDriverClass( "com.mysql.jdbc.Driver" );
dataSource.setJdbcUrl( "jdbc:mysql://localhost:3306/test" );
dataSource.setUser("root");
dataSource.setPassword("123456");
// the settings below are optional -- c3p0 can work with defaults
dataSource.setMinPoolSize(5); //设置最小值
dataSource.setAcquireIncrement(5); //设置增量
dataSource.setMaxPoolSize(20); //设置最大值
// The DataSource dataSource is now a fully configured and usable pooled DataSource
}
public static Connection getConnection() throws Exception {
if(null == dataSource)
{
init();
}
return dataSource.getConnection();
}
}
C3p0Factory2
DataSource ds=new ComboPooledDataSource();
//DataSource ds=new ComboPooledDataSource("otherc3p0");//加载其他连接配置
//dataSource 自动加载c3p0-config.xml文件
Connection connection=ds.getConnection();
System.out.println("connection = " + connection);
c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config> <!-- 默认配置 -->
<!--连接参数-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=GMT%2B8</property>
<property name="user">root</property>
<property name="password">root</property>
<!--连接池参数-->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">20</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/company?useSSL=false&serverTimezone=GMT%2B8</property>
<property name="user">root</property>
<property name="password">root</property>
<!--连接池参数-->
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">1000</property>
</named-config>
</c3p0-config>
DruidFactory1
public class DruidFactory1 {
private static DruidDataSource dataSource = null;
public static void init() throws Exception {
dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/test");
dataSource.setInitialSize(5);
dataSource.setMinIdle(1); //设置idle时间
dataSource.setMaxActive(10); //设置最大连接数
// 启用监控统计功能 dataSource.setFilters("stat");//
}
public static Connection getConnection() throws Exception {
if(null == dataSource)
{
init();
}
return dataSource.getConnection();
}
}
DruidFactory2
public class DruidDemo1 {
public static void main(String[] args) throws Exception {
Properties pro = new Properties();
InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");
pro.load(is);
DataSource ds=DruidDataSourceFactory.createDataSource(pro);
Connection connection = ds.getConnection();
System.out.println("connection = " + connection);
}
}
druid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useSSL=false&serverTimezone=GMT%2B8
username=root
password=root
#连接池参数
initialSize=5
maxActive=20
maxWait=3000
DruidUtil
public class druidUtil {
private druidUtil(){}
private static DataSource ds;
private static String url=null;
private static String username=null;
private static String password=null;
static {
try {
Properties pro=new Properties();
pro.load(druidUtil.class.getClassLoader().getResourceAsStream("druid.properties"));
ds=DruidDataSourceFactory.createDataSource(pro);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
public static void close(Statement statement,Connection conn){
close(null,statement,conn);
}
public static void close(ResultSet set,Statement statement, Connection conn){
if (set != null) {
try {
set.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 获取连接池方法
*/
public static DataSource getDataSource(){
return ds;
}
}
Spring JDBC:JDBCTemplate
Spring JDBC:Spring框架对JDBC的简单封装,提供了一个JDBCTemplate对象简化JDBC的开发
步骤:
-
导入jar包
-
创建JDBCTemplate对象。依赖于数据源DataSource
- JdbcTemplate template = new JdbcTemplate(ds);
-
调用JdbcTemplate的方法来完成CRUD的操作
-
update():执行DML语句。增删改语句
-
queryForMap():查询结果将结果集封装为map集合 (只能查询一条数据)
-
queryForList():查询结果将结果集封装为list集合
-
query():查询结果将结果集封装为JavaBean对象
-
一般我们使用BeanPropertyRowMapper实现类,可以完成数据到JavaBean的自动封装
-
List<Student> list = template.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
-
-
queryForObject:查询结果将结果集封装为对象
- 一般用于聚合函数的查询
-
eg:
JdbcTemplate template = new JdbcTemplate(druidUtil.getDataSource()); // 参数为database
//1、DML语句
String sql = "insert student (id,name,age,sex) values (?,?,?,?)";
int update = template.update(sql, "009", "tim", 96, "female");
//2、DQL语句
String sql = "select * from student where id=?";
Map<String, Object> map = template.queryForMap(sql,001); //map只能封装一条数据,否则报错
String sql = "select * from student";
List<Map<String, Object>> mapList = template.queryForList(sql);
List<Student> list = template.query(sql, new BeanPropertyRowMapper<Student>(Student.class));
String sql = "select count(id) from student";
Long aLong = template.queryForObject(sql, Long.class);
最后
以上就是健壮石头为你收集整理的Java数据库连接池学习笔记:C3P0、Druid;Spring JDBC的全部内容,希望文章能够帮你解决Java数据库连接池学习笔记:C3P0、Druid;Spring JDBC所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复