• java_第一年_JDBC(5)


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

    开始事务: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 = 0;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() > 0){
          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 = 123456
    jdbcPoolInitSize = 10

    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 = "123456"
              driverClassName = "com.mysql.jdbc.Driver"
              url = "jdbc:mysql://localhost:3306/jdbctext"
              maxActive = "8"
              maxIdle = "4" />
      </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);
              }
  • 相关阅读:
    hdu7047 /2021“MINIEYE杯”中国大学生算法设计超级联赛(7) 1004 Link with Balls
    hdu7115 Vertex Deletion
    CF1552B B. Running for Gold
    hdu7055 /2021“MINIEYE杯”中国大学生算法设计超级联赛(7) 1012 Yiwen with Sqc
    hdu7050 /2021“MINIEYE杯”中国大学生算法设计超级联赛(7) 1007 Link with Limit
    CF 1560E E. Polycarp and String Transformation(思维)
    CF 1542C C. Strange Function
    STL 算法 std::distance
    STL 算法 std::accumulate
    std::get<C++11多线程库~线程管理>(08):转移线程所有权(2)
  • 原文地址:https://www.cnblogs.com/lzj-learn/p/11672609.html
Copyright © 2020-2023  润新知