事务:要么成功,要么失败
ACID原则
原子性:要么全部完成,要么都不完成
一致性:最终的结果总数据不发生改变
隔离性:多个进程互不干扰
持久性:数据一旦提交不可逆,持久化到数据库
模拟转账事务
//模拟转账
public class TransferDemo {
public static void main(String[] args) throws SQLException {
//connection代表数据库
Connection connection = null;
PreparedStatement st = null;
try {
connection = JdbcUtil.getConnection();
//1.手动设置关闭自动提交事务,此时,事务自动开启
connection.setAutoCommit(false);
String sql1 = "update account set money = money - 100 where `name` = 'A';";
st = connection.prepareStatement(sql1);
st.executeUpdate();
int num = 1/0;//强制制造问题
String sql2 = "update account set money = money + 100 where `name` = 'B';";
st = connection.prepareStatement(sql2);
st.executeUpdate();
//2.提交数据
connection.commit();
System.out.println("转账成功");
} catch (SQLException e) {
//数据出现问题,事务会自动回滚到原来的样子,这里可以不用设回滚
try {
connection.rollback();
} catch (SQLException ex) {
ex.printStackTrace();
}
}finally {
JdbcUtil.release(connection,st,null);
}
}
问题:每次连接数据库都需要消耗大量的资源,效率低
解决:创建一个连接池。每次应用程序需要从数据库获取数据时,直接从连接池中申请一个连接使用,用完之后连接池回收连接,从而达到连接复用的效果,并减少资源消耗的目的
本质:准备一些预先的资源,过来就直接连接预先准备好的(池化技术)
开源的连接池项目:
-
DBCP
-
D3P0
-
Druid
使用了这些数据库连接池,我们就不需要编写连接数据库的代码
DBCP
InputStream rs = DBCPUtil.class.getClassLoader().getResourceAsStream("dbcp.properties");
Properties properties = new Properties();
properties.load(rs);
//获取数据源 BasicDataSourceFactory 工厂:用来创建对象的
dataSource = BasicDataSourceFactory.createDataSource(properties);
总结:无论用什么连接源,本质还是一样的,DataSource接口不会变,获取connection方法就不会变
标签:事务,JDBC,数据库,st,connection,日志,连接,连接池 From: https://www.cnblogs.com/yzx-sir/p/17401456.html