JDBC和数据库连接池
JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。
● JDBC
● C3P0
● DRUID
一.JDBC
1.基本使用
使用 JDBC 操作MySQL数据库时,可以将步骤分为以下7步:
// 1.注册驱动(将mysql的驱动类加载到内存中)
DriverManager.registerDriver(new Driver());
// 2.获取连接
String url = "jdbc:mysql://localhost:3306/db";
String username = "root";
String password = "root";
Connection con = DriverManager.getConnection(url, username, password);
// 3.编写sql
String sql = " ... ";
// 4.获取语句的执行器
Statement statement = con.createStatement();
// 5.执行sql并返回结果集
ResultSet rs = statement.excuteQuery(sql);
// 6.处理结果集
while(rs.next()){ ... }
// 7.释放资源
rs.close();
statement.close();
con.close();
2.PreparedStatement:预编译对象
为防止 SQL 注入,我们先将sql 传给数据库,将sql语句事先编译好,使用时直接赋真实值,执行sql即可。
// 使用 ? 占位
String sql = "select * from stu where id= ? "
// 创建预编译对象
PreparedStatement pst = con.prepareStatement(sql);
// 设置具体的参数 (第几个 ?, 具体值)
pst.set(1, 2);
// 执行sql
ResultSet rs = pst.executeQuery();
int i = pst.executeUpdate();
3.封装优化
由于Driver类的源码当中有注册驱动的静态代码块,因此我们可以不用自己再去注册(类加载后就完成了注册),同时为了避免硬编码和代码冗余我们将其优化,封装成简单工具类。
1.编写配置文件 :Jdbc.properties
# 数据库驱动配置
# Driver类的全限定类名(加载即完成注册)
jdbc.driver=com.mysql.jdbc.Driver
# 协议 协议 地址 端口 数据库
jdbc.url=jdbc:mysql://localhost:3306/db
# 用户名
jdbc.username=root
# 密码
jdbc.password=root
2.编写工具类 :JdbcUtils
public class JdbcUtils {
//声明配置信息
private static String driver;
private static String url;
private static String username;
private static String password;
private static Connection con;
//静态代码块,类加载时解析配置信息
static {
try {
InputStreamReader is = new InputStreamReader
(JdbcUtils.class.getResourceAsStream("/jdbc.properties"));
Properties properties = new Properties();
properties.load(is);
driver = properties.getProperty("jdbc.driver").trim();
url = properties.getProperty("jdbc.url").trim();
username = properties.getProperty("jdbc.username").trim();
password = properties.getProperty("jdbc.password").trim();
//加载驱动获取连接
Class.forName(driver);
con = DriverManager.getConnection(url, username, password);
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取数据库连接(如果连接关闭则重新创建)
public static Connection getConnection() {
try {
if (con.isClosed()) {
con = DriverManager.getConnection(
url,username,password);
return con;
}
} catch (SQLException e) {
e.printStackTrace();
return null;
}
return con;
}
// 关闭资源(有结果集)
public static void close(ResultSet rs, Statement s,
Connection con) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (s != null) {
try {
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (con != null) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 关闭资源(无结果集)
public static void close(Statement s, Connection con) {
close(null, s, con);
}
}
3.注意事项
// 需要注意的是
// 1.将jdbc.properties放到src文件下 // 2.解析配置文件时除上述写法还可以使用如下方式(此法针对src下的properties文件):
ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
driver = bundle.getString("jdbc.driver").trim();
url = bundle.getString("jdbc.url").trim();
username = bundle.getString("jdbc.username").trim();
password = bundle.getString("jdbc.password").trim();
在使用上述方法连接并操作数据库时,若没有按照上面的代码对连接的状态进行检查那么肯定会遇到这样一个异常:No operations allowed after connection closed. 因为我们只创建了一个连接,当完成一个操作后将其关闭,那么下一次操作获得的连接就是已经关闭了的连接,因此会发生此异常!上述代码中对连接进行了状态的判断,比较麻烦。而数据库连接池正是维护着几个连接供我们使用,使用后将其归还至连接池(并不是真的关闭)。
二.C3P0连接池
C3P0是开源的连接池,Hibernate框架默认使用的就是C3P0连接池。使用配置文件创建连接池时注意文件名称“ c3p0-config.xml"不能更改(放在src下)。
1.创建配置文件:c3p0-config.xml
<c3p0-config>
<!-- 使用默认的配置读取连接池对象 -->
<default-config>
<!-- 连接参数 -->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/db</property>
<property name="user">root</property>
<property name="password">root</property>
<!-- 连接池参数 -->
<property name="initialPoolSize">5</property>
<property name="maxPoolSize">10</property>
<property name="checkoutTimeout">3000</property>
</default-config>
<!-- 指定名称的配置信息 -->
<named-config name="myc3p0">
<!-- 连接参数 -->
<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>
2.获取连接池对象
// 关键代码
// 使用默认配置获取连接池对象
ComboPooledDataSource comboPooledDataSource =
new ComboPooledDataSource();
// 使用指定的配置 (配置名) 获取连接池对象
ComboPooledDataSource comboPooledDataSource =
new ComboPooledDataSource("myc3p0");
三.DRUID(德鲁伊)连接池
DRUID是阿里巴巴开发的目前最好的数据库连接池。 com.alibaba.druid.pool.DruidDataSourceFactory 类创建连接池的方法:
1.创建配置文件:mydruid.properties
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/db
username=root
password=root
initialSize=5
maxActive=10
maxWait=3000
minIdle=3 # 最小连接池数量
2.获取连接池对象
Properties prop = new Properties();
InputStream is = DruidDemo.class.getClassLoader().
getResourceAsStream("mydruid.properties");
prop.load(is);
//druid工厂根据配置文件创建druid连接池对象
DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
四.DRUID工具类封装
1.配置文件(参上)
2.关键代码
private static DataSource dataSource;
static{
try {
// 解析druid的配置文件
Properties prop = new Properties();
InputStream is = JDBCUtil.class.getClassLoader().
getResourceAsStream("druid.properties");
prop.load(is);
// druid工厂使用配置文件创建druid连接池对象
dataSource = DruidDataSourceFactory.createDataSource(prop);
} catch (Exception e) {
e.printStackTrace();
}
}
//获取druid连接池
public static DataSource getDataSource(){
return dataSource;
}
//获取druid连接池中的连接
public static Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
//释放资源(归还连接)
public static void close(ResultSet rs, Statement st,Connection conn) {
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(st!=null){
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement st,Connection conn) {
close(null,st,conn);
}
Tips:
// 将properties文件放到src下时
JdbcUtils.class.getResourceAsStream("/jdbc.properties")
//两种方式的参数不一样
JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties")
关注微信公众号,随时随地学习
JDBC和数据库连接池的更多相关文章
- 数据库连接JDBC和数据库连接池C3P0自定义的java封装类
数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...
- Java -- JDBC 学习--数据库连接池
JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...
- JDBC【数据库连接池、DbUtils框架、分页】
1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...
- Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用
DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...
- 基于JDBC的数据库连接池技术研究与应用
引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...
- spring配置tomcat jdbc pool数据库连接池
<bean id="sqliteDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" de ...
- JavaEE JDBC 了解数据库连接池
了解数据库连接池 @author ixenos 数据库连接是有限的资源,如果用户需要离开应用一段时间,那么他占用的连接就不应该保持开放状态: 另一方面,每次查询都获取连接并在随后关闭它的代价也很高. ...
- 关于jdbc和数据库连接池的关系(不是封装的关系)
你都说是数据库连接池了.那就是连接数据库用的.JDBC是java封装的对数据库的操作.当然你可以自己进一步封装.数据库连接池是JDBC使用的前提,如果连数据库连接池都没连上,JDBC的操作就谈不上了. ...
- Jdbc druid数据库连接池
//测试类package druid; import util.JdbcUtilsDruid; import java.sql.Connection; import java.sql.Date; im ...
随机推荐
- 在springBoot与quartz 整合中 @Transaction 失效
问题1::springBoot在与quartz 整合时,使用@Transaction 注解时事务失效 解决方案:创建一个类使用@component被spring管理 ,使用@Transaction标识 ...
- mysql性能调优——锁优化
影响mysql server性能的相关因素 需求和架构及业务实现优化:55% Query语句优化:30% 数据库自身优化:15% 很多时候大家看到数据库应用系统中性能瓶颈出现在数据库方面,就希望通过数 ...
- JSP发送电子邮件
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/sending-email.html: 发送一个简单的电子邮件 给出一个简单的例子,从机器上发送一个简单的 ...
- 苹果Macbook Air怎么安装Win7系统图解教程
下面开始我们在苹果Macbook Air上的Windows7之旅吧.
- iOS 远程推送原理及实现
关于iOS 实现消息推送的原理: 1.provide[server]把要发送的消息,目的IOS设备标识打包.发送给APNS 2.APNS在自身已注冊Push服务的IOS设备列表中.查找有对应标识的IO ...
- JMS消息中间件原理及ActiveMQ用法
导读: JMS:Java消息服务(Java Message Service)应用程序接口.是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息.进行 ...
- KLT 光流
一 光流 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在 ...
- Android多媒体-MediaPlayer唤醒锁及音频焦点
MediaPlayer的唤醒锁 一般使用MediaPlayer播放音频流,推荐使用一个Service来承载MediaPlayer,而不是直接在Activity里使用.可是Android系统的功耗设计里 ...
- java后台修改ZK页面的title
Clients.evalJavaScript("document.title='"+basicDBObject.getString("systemName")+ ...
- 如何让aboboo 便携版在citrix下使用(aboboo在IPAD上使用)aboboo苹果版
公司使用的是citrix的共享虚拟桌面.如何可以让aboboo在其下面运行呢? 网上有提供绿色版,但是总是弹出首次配置无法安装的报错界面. 察看帮助文档:http://www.aboboo.com/d ...