JDBC操作事务, 数据库连接池
JDBC操作事务
ACID原则
原子性:要么全部完成,要么都不完成
一致性:总数不变
隔离性:多个进程互不干扰
持久性:一旦提交不可逆,持久化到数据库了
隔离性的问题:
脏读:一个事务读取了另一个没有提交的事务
不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变
虚读(幻读):在一个事务内,读取到了别人插入的数据,导致前后读出的数据不一致
package com.JDBC.www;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.jdbc.Statement;
public class Demo03 {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1. 加载驱动
Class.forName("com.mysql.jdbc.Driver"); //固定写法,加载驱动
//2.用户信息和url
//useUnicode=true&characterEncoding=utf8&useSSL=true
String url="jdbc:mysql://localhost:3306/persion?useUnicode=true&characterEncoding=utf8&useSSL=true";
String username="root";
String password="123456";
//3.连接成功,数据库对象 connection 代表数据库
Connection connection=DriverManager.getConnection(url, username,password);
//4.关闭数据库的自动提交,自动会开启事务
connection.setAutoCommit(false); //开启事务
//5. 预编写sql语句
String sql="SELECT *FROM `one_persion` WHERE NAME=?";
//5. 执行SQL的对象PreparedStatemment执行sql的对象
PreparedStatement statement=connection.prepareStatement(sql);
//手动给参数赋值
statement.setString(1, "流进是2");
ResultSet result=statement.executeQuery();
//业务完毕,提交事务
connection.commit();
//如果失败,默认回滚
while(result.next()) {
System.out.println(result.getInt("id"));
System.out.println(result.getString("name"));
System.out.println(result.getInt("age"));
System.out.println(result.getString("dz"));
}
//6.释放连接
result.close();
statement.close();
connection.close();
}
}
数据库连接池
数据库连接—执行完毕----释放
连接----释放 十分浪费系统资源
池化技术:准备一些预备的资源,过来就连接预先准备好的
最小连接数:10个
最大连接数:15 业务最高承载上限
等待超时:100ms
编写连接池,只需要实现一个接口 DataSource
开源数据源实现
DBCP
C3P0
Druid:阿里巴巴
使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了
DBCP
需要用到的jar包
commons-dbcp-1.4 , commons-pool-1.6
C3P0
需要用到的jar包
c3p0-0.9.5.2 , mchange-commons-java-0.2.12
总结
无论使用什么数据源,本质还是一样的, DataSource