事务概念:事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功;

开始事务:start transaction

提交事务:commit

回滚事务:rollback

事务的四大特性

原子性:是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败

一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态

隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

持久性:一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

隔离性可能会引起的问题

脏读:脏读指一个事务读取了另外一个事务未提交的数据

不可重复读:不可重复读指在一个事务内读取表中的某一行数据,多次读取结果不同;所操作的数据被别的事务操作,通过给操作数据加行锁即可;

虚读(幻读):是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致;操作的数据被别的事务所插入,仅通过行锁并不能解决;

四种隔离级别

针对上述所说的隔离性问题,mysql数据库共定义了4种隔离级别

查询隔离级别:select @@tx_isolation;

设置隔离级别:set transaction isolation level 隔离级别名;

  • Read uncommitted(读未提交):最低级别,以上情况均无法保证;
  • Read committed(读已提交):可避免脏读情况发生;
  • Repeatable read(可重复读):可避免脏读、不可重复读情况的发生;
  • Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生;

数据库连接池

如果每次客户端的每次请求都由应用程序直接获取数据库连接的话,那会极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机;

数据库连接池正式针对这个问题提出来的,数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;

最小连接数:是连接池一直保持的数据库连接数;

最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中;

超过最小连接数量的连接请求等价于建立一个新的数据库连接.不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,他将被放到连接池中等待重复使用或是空间超时后被释放;

编写数据库连接池

编写数据库连接池需要用到java.sql.DataSourse接口,其中定义了两个重载的getConnection方法:Connection getConnection()和Connection getConnection(String username,String password)方法;实现DateSourse接口,编写数据库连接池的步骤:

  1. 批量创建与数据库的连接,并将这些连接加入到Linkedlist对象中:

    private static LinkedList<Connection> listConnections = new LinkedList<Connection>();
    //导入db.properties数据库配置文件
    InpitStream in = this.class.getClassLoader().getResourseAsStream("db.properties");
    Properties prop = new Properties();
    try{
    prop.load(in);
    String driver = prop.getProperty("diver");
    String url = prop.getProperty("url");
    String username = prop.getProperty("username");
    String password = prop.getProperty("password");
    int jdbcPoolInitSize = Integer.parseInt(prrp.getProperty("jdbcPoolInitSize"));
    Class.forName(driver);
    for (int i = ;i<jdbcPoolInitSize;i++){
    Connection conn = DriverManager.getConnection(url,username,password);
    listConnections.(conn);
    }
    } catch(Exception e) {
    throw new ExceptionInitializerError(e);
    }
  2. 实现getConnection方法,在其方法调用时,从LinkedList对象中调用一个Connection返回给用户:
    if(listConnections.size() > ){
    final Connection conn = listConnection.removeFirst();
      ...
       return ...
    }
  3. 当使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库:
    return (Connection) Proxy.newProxyInstanse(this.class.getClassLoader(),conn.getClass().getInterfaces(),new InvocationHandler(){
    @override
    public Object invoke(Object proxy,Method method,Object[] args)
    throw Throwable{
    if (!method.getName().equals("close")){
    return method.invoke(conn,args);
    } else {
    listConnections.add(conn);
    return null;
    }
    }
    });

    判断conn对象是否有调用close方法,如果有,则把conn还给数据库连接池;

db.properties配置文件内容如下:

driver = com.mysql.jdbc.Driver
url = jebc:mysql://localhost:3306/jdbctest
username = root
password =
jdbcPoolInitSize =

Tomcat服务器配置数据库连接池

JNDI(Java Naming and Directory Interface),Java命名和目录接口;

这 套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需 通过名称检索即可。其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。

在使用Tomcat服务器时,可以让tomcat在启动时帮我们创建一个数据库连接池,Tomcat服务器创建的数据源是以JNDI资源的形式发布的,所以说在Tomat服务器中配置一个数据源实际上就是在配置一个JNDI资源,这样我们直接使用就可以了;配置步骤如下:

  1. 在Web项目的WebRoot目录下的META-INF目录创建一个context.xml文件用以配置连接池得属性,如:

    <Context>
    <Resourse
    name = "jdbc/datasource"
    auth = "Container"
    tape ="javax.sql.DateSourse"
    root = "root"
    password = ""
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://localhost:3306/jdbctext"
    maxActive = ""
    maxIdle = "" />
    </Context>
  2. 需将数据库得驱动jar文件放置到tomcat得lib目录下;
  3. 在连接数据库的工具类中的静态代码中获取JNDI容器中的数据源:
    static{
    try{
    //初始化JNDI
    Context initCtx = new InitialContext();
    //得到JNDI容器
    Context envCtx = (Context) initCtx.lookup("java:comp/env");
    //从JNDI容器中检索name为jdbc/datasource的数据源
    ds = (DataSource)envCtx.lookup("jdbc/datasource");
    }catch (Exception e) {
    throw new ExceptionInInitializerError(e);
    }

java_第一年_JDBC(5)的更多相关文章

  1. java_第一年_JDBC(7)

    Commons-dbutils是一个开源的JDBC工具类库,对JDBC进行封装,简化编码的工作量,包含的API: org.apache.commons.dbutils.QueryRunner org. ...

  2. java_第一年_JDBC(2)

    上篇说到,通过JDBC可实现java编程程序和mysql数据库进行连接并交互,而交互后所形成的结果集是通过ResultSet对象来操作的. 创建ResultSet对象: stmt = conn.cre ...

  3. java_第一年_JDBC(1)

    JDBC(Java Data Base Connectivity),用于实现java语言编程与数据库连接的API. 数据库驱动:应用程序并不能直接使用数据库,而需要通过相应的数据库驱动程序后再操作数据 ...

  4. java_第一年_JDBC(6)

    DataBaseMetaData对象:由Connection.getDataBaseMetaData()方法获得,可以用来获取数据库的元数据,提供的方法有: getURL():返回一个String类, ...

  5. java_第一年_JDBC(4)

    注:该篇只是为了小白的我熟悉下JDBC的代码,练习篇 在mysql中建test测试库,并创建一张employees表,加入一些数据如下图: 通过JDBC连接对表中数据进行添加: package lzj ...

  6. java_第一年_JDBC(3)

    事务 我们在通过JDBC连接数据库并开始交互时,默认情况下是自动提交的,有时由于为了保持业务流程的完整性.提高性能或是使用分布式事务,需要启动支持事务,此时的方法是调用Connection对象的set ...

  7. java_第一年_JavaWeb(14)

    EL :EL表达式主要用于获取数据.执行运算.获取对象.调用java方法: 获取数据 语法:"${标识符}" 会调用pageContext.findAttribute方法,从pag ...

  8. java_第一年_JavaWeb(13)

    JSTL标签库——核心标签库 为了弥补html标签的不足,为了更加方便地在jsp页面中使用java逻辑代码,JSTL标签库因运而生,而其中的佼佼者,被恩宠最多的就是核心标签库了: 核心标签库从功能上可 ...

  9. java_第一年_JavaWeb(11)

    自定义标签:主要是用来移除JSP页面中的java代码. 先从一个简单的案例了解其怎么移除代码: 一个正常的jsp页面: <%@ page language="java" pa ...

随机推荐

  1. Manjaro系统和软件安装记录

    Linux桌面环境  ArchLinux官方wiki manjaro官方wiki pacman官方wiki 从www.distrowatch.com可以查看Linux发行版排行榜,可以看到manjar ...

  2. computed 与methods , watched 的区别

    computed 与watched 的区别: 异步请求 数据变化 使用watched ,计算属性不支持异步 计算一个值的结果 用 computed computed 与methods的区别: comp ...

  3. [每日一讲] Python系列:字符串(上)

    字符串作为人类最常处理的内容,在计算中决定了其占有重要的地位.在 Python 中,字符串的操作和处理往往需要根据实际问题,结合其他操作才可以完成目标.在复杂世界仅仅是字符串 API 还无法完成工作. ...

  4. 【leetcode】493. Reverse Pairs

    题目如下: 解题思路:本题要求的是数组每个元素和所有排在这个元素后面的元素的值的二倍做比较.我们可以先把数组所有元素的二倍都算出来,存入一个新的数组newlist,并按升序排好.而后遍历nums数组的 ...

  5. zrender的线性渐变

    线性渐变 官方文档是这样写的 实际运用是酱紫的 在把颜色放背景中 小白一枚,路过大神,多多指教.欢迎留下宝贵意见

  6. java浅克隆和深克隆,序列化和反序列化实现深克隆(封装序列化和反序列化操作)

    本篇博客内容: 一.浅克隆(ShallowClone)和深克隆(DeepClone) 二.序列化和反序列化实现深克隆 三.封装序列化和反序列化操作 ObjectOutputStream + 内存流By ...

  7. codevs 1026 逃跑的拉尔夫 x

    1026 逃跑的拉尔夫  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他 ...

  8. JavaScript公共库event-stream被植入恶意代码

    [安全预警]JavaScript公共库event-stream被植入恶意代码 2018年11月27日,阿里云云盾应急响应中心监测到JavaScript公共库event-stream被植入恶意代码,该恶 ...

  9. struct files_struct

    内核利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表.当程序打开一个现有文件或者创建一个新文件时,内 ...

  10. Vue知识整理5:v-bind绑定属性(Class 与 Style 绑定)

    通过v-bind实现Class 与 Style 绑定,方便调整属性的值