JavaWeb系列之十三(jdbc事务与连接池)



1.事务:表示一组操作要么都成功,有一个失败,所有操作都会失败。

在mysql要使用事务,就要先开启事务,语句start transaction,提交事务:commit 回滚事务:rollback。

转账:

2.jdbc事务的操作

(1)操作事务的方法

setAutoCommit(boolean autoCommit) 设置事务的提交方式,默认自动提交,设置为fals不会提交

提交事务commit()

回滚事务rollback()

使用jdbc来完成转账

小金跟小李接一千

(2)设置事务的回滚点

回滚的时候还要提交,commit(sq);会回到设置回滚点的地方

3.事务的特性:

四个特性:1.原子性:在事务里面操作,要么成功,要么都失败

2.一致性:在事务操作过程中,数据要保持一致性,比如钱不会多,也不会少

3.隔离性:多个事务同时对一张表操作,多个事务不会互相影响

4.持久性:提交事务到数据库,是真正生效

4.事务的隔离性

不考虑事务的隔离性,产生一些问题,五个问题

三个读对的问题:第一个问题:脏读,一个事务获取到另外事务的没有提交的事务

第二个问题:不可重复读,一个事务里面查询到已经提交的事务,另外一个事务里面是update,导致两个事务查询到的数据是不一样的。

第三个问题:虚读:一个事务里面查询到另外一个事务里面insert操作

解决方式:通过隔离级别解决这些读的问题

Serializable:串行的.避免脏读、不可重复读和虚读发生

Repeatable read:重复读. 避免脏读、不可重复读.但是虚读还是有可能发生的,默认是这个,两个事务都需要提交了,才能查询到

Read committed:已提交读.避免脏读.但是不可重复读和虚读有可能发生,提交的时候,才能查询到钱,避免了损失。导致两个事务查询到的数据是不一样的

Read uncommitted:未提交读.脏读、不可重复读、虚读都可能发生 没有提交就可以查询到内容,如果回滚的话,就会查不到钱。

select @@tx_isolation;  查询当前事务隔离级别

set session transaction isolation level  设置事务隔离级别

(1)演示脏读

第一步:打开两个cmd窗口

第二步:设置隔离级别

第三步:开启事务

第四步:在左边查看数据

Read committed:在左边窗口通过食物查看数据,这两次看得结果不一样,

多个事务之间互相印象,不可重复读

5.mysql数据库的备份和还原

第一种:使用可视化工具进行备份

第二种:使用sql语句

mysqldump -u root -p  要备份的数据名称>要放的磁盘

通过这个语句备份的数据库语句里面,没有创建数据库的语句

注意1:不能连接数据库

注意2:没有创建数据库的语句

注意3:备份文件要以.sql为后缀名

注意4:备份路径不能有中文

mysqldump -u root -p day16 >d:\day17.sql

还原数据库

mysql -u root -p 要还原的数据库<备份的文件路径

注意1:执行的语句后面不能写分号

注意2:不要登录

6.连接池的概述

之前得到数据库连接DriverManager.getConnection();

每个用户连接都需要执行一次,运用连接池来解决

预先创建一些连接,放到内存中的一个空间,每次访问的时候,从内存空间里面获取一个链接,用完之后不进行关闭,放回内存空间里面,供其它用户使用。避免频繁的创建和关闭在内存空间理解为,一个容器,容器里面放着数据库的连接。

自定义连接池(了解)

创建一个类实现一个接口DataSource

在内存中分配一个空间List集合,把创建的多个连接放到集合里面

把创建的连接放到集合里面去   add()

把链接取出来,remove(0)

开源的连接池

DBCP连接池

C3P0连接池(一般企业中的都使用这个连接池)

Tomcat内置的连接池

如何增强一个类的方法

第一种继承

public class TestMethod {

public static void main(String[] args) {

Man m=new SuperMan();

m.run1();

}

}

class Man{

public void run1(){

System.out.println("nam run");

}

}

class SuperMan extends Man {

public void run1(){

//super.run1();

System.out.println("supernam run");

}

}

第二种装饰者模式

首先创建一个接口,在接口里面定义一个方法

写两个类,这两个类分别实现这个接口

在增强的方法所在类里面,得到增强方法所在类的引用

public class TestMethod2 {

public static void main(String[] args) {

Diao d=new Diao(new Ying());

d.fly();

}

}

interface Bird{

public void fly();

}

class Ying implements Bird{

public void fly() {

// TODO Auto-generated method stub

System.out.println(1000);

}

}

class Diao implements Bird{

private Bird bird;

public Diao(Bird bird){

this.bird=bird;

}

public void fly() {

// TODO Auto-generated method stub

bird.fly();

System.out.println(0);

}

}

第三种动态代理

9.开源连接池

DBCP连接池:Apache软件组织,开源的连接池,首先导入jar包

BasicDataSource :手动配置文件方式

BasicDataSourceFactory:自动配置文件,配置文件的名称是固定的不能改变

C3p0连接池

想要使用c3p0连接池,的jar包

ComboPooledDataSource    完成连接池的连接

第一种手动进行配置,创建类

combo.setDriverClass("com.mysql.jdbc.Driver");

combo.setJdbcUrl("jdbc:mysql:///day18");

combo.setUser("root");

combo.setPassword("root");

第二种配置

创建一个配置文件,不是properties格式,是xml配置文件

注意1:xml的名称是固定c3p0-config.xml.,注意2:配置文件要放在src下面,不能放在其他下面,

在new ComboPooledDataSource("")不写或则写错,找默认读取defalut-config
里面的信息,

tomcat内置连接池

使用的jndi技术,需要在tomcat里面进行

有一个类,想要调用这个类,给类起一个名称,通过起这个名字访问类

* 步骤

第一步: 创建一个配置文件,名字固定context.xml

这个文件需要创建在可以有三个地方

第一个可以把文件创建在conf目录下面: 在tomcat里面所有的虚拟主机都可以使用

第二个可以把文件创建\conf\Catalina\localhost:只能在当前的虚拟主机里面使用

第三个可以把文件创建在META-INF:只能在当前的项目里面使用(一般都使用这种方式)

第二步:创建servlet实现连接池

由于tomcat内置的连接池,必须要运行在tomcat里面才可以使用这个连接池

时间: 2024-08-24 03:42:44

JavaWeb系列之十三(jdbc事务与连接池)的相关文章

eclipse下jdbc数据源与连接池的配置及功能简介

今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急剧下降,那么怎么解决这个问题呢? 我所学到的方法就是通过JDBC数据源和连接池的方式来解决这个问题.利用DataSource来建立数据库的连接不需要加载JDBC驱动,也不需要DriverManager类,通过向一个JNDI服务器查询来得到DataSource对象,然后调用DataSource对象的g

Java实战之04JavaWeb-05事务和连接池

一.事务部分 1.事务的简介 做一件事情,这个一件事情中有多个组成单元,这个多个组成单元要不同时成功,要不同时失败.A账户转给B账户钱,将A账户转出钱的操作与B账户转入钱的操作绑定到一个事务中,要不这两个动作同时成功,代表这次转账成功,要不就两个动作同时失败,代表这次转账失败. 2.mysql的事务控制 mysql默认事务是自动提交的,一条sql是一个事务 手动开启事务:start transaction 当手动开启事务后,数据库默认的事务的自动提交暂时失效 提交事务:commit 提交事务到开

JDBC数据源和连接池

数据库连接池就是在应用程序启动时就创建足够多的数据库连接池,在java程序中需要访问 数据库时就可以通过数据源取得一个空闲连接,用完在返还到连接池中 实例: 在Tomcat6.0中+MySQL5.5数据源和连接池的配置 (1)将数据库的JDBC驱动程序复制到<CATALINA_HOME>/common/lib目录下 (2)在<CATALINA_HOME>/conf/server.xml中配置数据源和连接池,例如 <Context path="/JSP_JDBC&qu

jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃.数据库连接池技术是解决这个问题最常用的方法. 数据库连接池的主要操作如下: (1)建立数据库连接池对象. (2)按照事先指定的参数创建初始数量的数据库连

JDBC第一天连接池案例

JDBC,JDBC的工具类JDBC 连接从连接池中拿: 创建连接池的语句: package day01; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.dbcp2.BasicDataSource; public class DBUtils { private

【JDBC】使用连接池技术访问oracle

使用连接池访问数据库之前需要导入相关的jar包, 首先需要导入Oracle的驱动包,一般在安装Oracle数据库的目录下就有,读者的目录下就有一个ojdbc6.jar的驱动包. 然后再需要导入和连接池相关的jar包,比如:commons-dbcp-1.4.jar,和commons-pool-1.5.6.jar包. 下面是一个使用连接池包装好的工具包: driverClassName=oracle.jdbc.OracleDriver url=jdbc:oracle:thin:@localhost:

【JDBC】C3P0连接池的使用

C3P0连接池的c3p0-config.xml配置文件 <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl&

【58沈剑架构系列】一分钟写好连接池

一.如何通过连接访问下游 工程架构中有很多访问下游的需求,下游包括但不限于服务/数据库/缓存,其通讯步骤是为: (1)与下游建立一个连接 (2)通过这个连接,收发请求 (3)交互结束,关闭连接,释放资源 这个连接是什么呢,通过连接怎么调用下游接口?服务/数据库/缓存,官方会提供不同语言的Driver.Document.DemoCode来教使用方建立连接与调用接口,以MongoDB的C++官方Driver API为例(伪代码): DBClientConnection* c = new DBClie

JDBC之Druid连接池的使用

一个基本项目结构由DB类(负责连接数据库的工作),DAO接口及实现类(继承DB类),bean对象封装类,Druid在DB和DAO内使用 DB类: DB类负责获取数据源,基本步骤如下 1.准备配置文件 db.properties url=jdbc:oracle:thin:@192.168.31.50:1521:orcl username=hanxd password=123 2.在DB类中读取配置文件到InputStream中 InputStream is = DB.class.getClassL