数据库连接池
项目中肯定会使用数据库连接池
项目中一般使用druid
C3P0
基本用法
package com.qfedu.c3p0;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class App {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// test1();
test2();
}
public static void test1() throws Exception {
// 创建c3p0的数据库池连接对象
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 配置
dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&useSSL=false");
dataSource.setUser("root");
dataSource.setPassword("root");
// 初始连接数
dataSource.setInitialPoolSize(3);
// 最大连接数
dataSource.setMaxPoolSize(10);
// 最大空闲时间,单位毫秒
dataSource.setMaxIdleTime(2000);
// 通过连接池获取连接对象
Connection connection = dataSource.getConnection();
System.out.println(connection);
// 将连接对象还回连接池
connection.close();
}
/**
* 读取c3p0的配置文件
* 正常的url jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&useSSL=false
* &在xml中属于特殊符号,所以在xml中需要使用 实体符号 &替换
* <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&userSSL=false</property>
*
* @throws Exception
*/
public static void test2() throws Exception {
// 自动读取src下的c3p0-config.xml
// 默认加载<default-config>中的配置
ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 获取连接对象
Connection connection = dataSource.getConnection();
System.out.println(connection);
// “关闭”连接对象,将连接对象还回连接池
connection.close();
}
}
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&useSSL=false</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">6</property>
<property name="maxIdleTime">2000</property>
</default-config>
<named-config name="myconfig">
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///supermarket</property>
<property name="user">root</property>
<property name="password">root</property>
<property name="initialPoolSize">3</property>
<property name="maxPoolSize">6</property>
<property name="maxIdleTime">2000</property>
</named-config>
</c3p0-config>
结合DBUtils
package com.qfedu.utils;
import org.apache.commons.dbutils.QueryRunner;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
// ComboPooledDataSource 实现 jdbc中的DataSource接口
private static ComboPooledDataSource dataSource = null;
// 创建连接池对象
static {
dataSource = new ComboPooledDataSource();
}
public static QueryRunner getQueryRunner() {
// javax.sql.DataSource
// QueryRunner(DataSource ds)
// 将DBUtils和数据库连接池产生了关联
// QueryRunner内部维护连接对象
return new QueryRunner(dataSource);
}
}
public static void test2() throws Exception {
QueryRunner qr = C3P0Utils.getQueryRunner();
String sql = "select count(*) from t_person";
// QueryRunner内部维护连接对象,调用query,不需要connection参数
// 执行完,也不需要手动关闭connection对象
Long count = qr.query(sql, new ScalarHandler<Long>());
System.out.println(count);
}
Druid
基本用法
package com.qfedu.druid;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.qfedu.utils.DruidUtils;
public class App {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// test1();
test2();
}
public static void test1() throws Exception {
// 通过Properties加载properties文件中内容
FileInputStream inputStream = new FileInputStream("src/druid.properties");
Properties prop = new Properties();
prop.load(inputStream);
// 获取连接池对象
// javax.sql.DataSource
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
Connection connection = dataSource.getConnection();
System.out.println(connection);
connection.close();
}
public static void test2() throws Exception {
QueryRunner queryRunner = DruidUtils.getQueryRunner();
String sql = "select count(*) from t_person";
Long count = queryRunner.query(sql, new ScalarHandler<Long>());
System.out.println(count);
}
}
# \u6587\u4EF6\u540D druid.properties \u5B58\u50A8\u5728src\u76EE\u5F55\u4E0B
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&useSSL=true
username=root
password=root
# \u521D\u59CB\u5316\u6570\u636E\u5E93\u8FDE\u63A5\u6C60\u4E2D\u8FDE\u63A5\u4E2A\u6570
initialSize=5
# \u6700\u5927\u4E2A\u6570
maxActive=20
# TimeOut \u7B49\u5F85\u8D85\u65F6\u65F6\u95F4
maxWait=2000
结合DButils
package com.qfedu.utils;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DruidUtils {
private static DataSource dataSource = null;
static {
try {
FileInputStream inputStream = new FileInputStream("src/druid.properties");
Properties prop = new Properties();
prop.load(inputStream);
// 创建连接池对象
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* 创建QueryRunner对象,一定要注意,参数使用连接池对象
* @return
*/
public static QueryRunner getQueryRunner() {
return new QueryRunner(dataSource);
}
}
Web服务器
C/S Client/Server
B/S Browser/Server 浏览器/服务端
借助Http协议
Http协议介绍 了解
请求-响应协议
浏览器端发送http请求,服务端根据请求,向浏览器端返回响应的数据
请求
请求行 请求头 请求体(post)
提交方式:主要get post
get方式将提交的数据放在url,不安全;post方式将提交的数据放在请求体中
get方法提交的数据大小有限制;post方式提交的数据,大小无限制
get方式相对快,缓存静态资源
get一般用于查询,post一般用于修改和添加
响应
响应行 响应头 响应体
响应状态:200 302 404 500
Tomcat基本介绍
更适合中小项目
使用tomcat,一定要配置 JAVA_HOME环境变量
验证:bin下面运行startup.bat ,启动tomcat服务器
浏览器中 http://localhost:8080 验证是否可以正常访问