sql相关知识:池、事务、serverlet中资源调用

栏目: 数据库 · 发布时间: 4年前

内容简介:所以一些默认的,只需要执行一次的方法,可以放到静态块中。例如sql的底层底层放到类中,当classloader加载的时候,直接完成初始化,如下:Class.forname("com.mysql.jdbc.Driver");在sql中是访问操作数据库的一个程序执行单元。具有原子性、一致性、永久性、隔离性。
  1. static 函数与属性。属于所有的对象共有的。在class加载的时候创建
  2. static {}:静态块,属于Class的,是classloader加载的时候调用
  3. {}非静态块,在构造函数调用之前调用
  4. 构造函数,创建对象的时候,进行初始化操作
  5. 普通的状态与函数,通过对象调用

所以一些默认的,只需要执行一次的方法,可以放到静态块中。例如 sql 的底层底层放到类中,当classloader加载的时候,直接完成初始化,如下:

Class.forname("com.mysql.jdbc.Driver");

事务

在sql中是访问操作数据库的一个程序执行单元。具有原子性、一致性、永久性、隔离性。

事务的触发方式为在sql的终端:

  1. 启动事务 start transaction;
  2. commit;提交事务
  3. rollback;回退。
  4. rollback还是设置站定。

jbdc中的事务设置

默认到数据库的connnect是事务是自动进行的,没有条语句为一个事务。在jbdc中设置相应的设置方式: 1.启动 connect.setAutoTranscation(false); 2.connnect.commit();提交事务处理 3.connect.rollback();回退事务。

java一般处理方法如下:

Connection connect=....;
try{
    .............
    .........
    connet.commmit();
}catch execpution e{
    rollaback();
}finally{
    connect.close();
}
复制代码

sql的事务并发问题

  1. 脏读,读取其他事务未提交的事务,未提交的事务可能会撤回。这个问题最为严重
  2. 不可重复读:在一个事务中,多次重复读得到数据不相同。原因有其他任务提交事务。
  3. 幻读 数据库的条目发生了变化。 事务隔离的等级:
  4. read uncommitted;读取没有提交事务,存在所有的并发问题,这种安全性最差,吞吐量最大
  5. read committed;读提交以后的事务,存在幻读与不可重复读的问题。安全性较好,吞吐量一般。oracle的默认
  6. repeatable read;多次读事务的值相同,如果有其他任务提交,读取数值不变,存在幻读的问题。安全性较好,吞吐量一般。mysql的默认
  7. serializable;串行操作事务,安全性最高能解决所有并发问题,吞吐量最小

总结事务的隔离等级中已经用了锁的概念。两个事务不能同时写入一个单元。所以在保证读写的情况下操作方式为:

可以防止任务干扰

read()
write()
read()
write()

复制代码

更改事务的隔离等级----终端

通过设置tx_isolation变量。

  1. 查询 show variables like 'tx_isolation';或者select @@tx_isolation;
  2. 设置 set tx_isolation="read-committed';

事务等级-----jdbc

jbdc的设置方法。通过设置con. setTransactionIsolation(int level) 参数可选值如下:

  1. Connection.TRANSACTION_READ_UNCOMMITTED;
  2. Connection.TRANSACTION_READ_COMMITTED;
  3. Connection.TRANSACTION_REPEATABLE_READ;
  4. Connection.TRANSACTION_SERIALIZABLE。

读取:getTransaction();

连接池的概念

连接池就是资源池的概念,与线程池类似。创建好并进行管理,如有需要直接调用。 主要参数:

  1. 最大数量
  2. 初始化数量
  3. 最大空闲数量
  4. 单次创建增量
  5. 等待时间,当资源达到最大数量的时候,再申请资源进入等待状态,等待超时,抛出异常

javax包中提供了数据的连接池DataSource接口,但是标准没有具体的实现。

apache的实现

数据包为:commons-dbcp-1.4.jar 调用方式如下:

BasicDataSource dataSource1=new BasicDataSource();
        dataSource1.setUrl(uri);
        dataSource1.setUsername(username);
        dataSource1.setPassword(password);
        dataSource1.setDriverClassName(sqlDriver);


        dataSource1.setMaxActive(30);
        dataSource1.setMaxIdle(3);
        dataSource1.setInitialSize(10);
        dataSource1.setMaxWait(1000);
        
        dataSource1.getConnection()
复制代码

c3p0的连接池的实现:

应用配位更为灵活,具有默认配置方式。一般我们采用这一种。对应的数据包为

  1. c3p0-0.9.2-pre1.jar
  2. mchange-commons-0.2.jar
  3. 配置文件名字为:c3p0-config.xml。放在src文件夹下
static public DataSource  getC3P0DataSource()  {
        return  new ComboPooledDataSource();
    }
复制代码

或者如下,配置方式再增加

ComboPooledDataSource dataSource1=new ComboPooledDataSource();
        dataSource1.setJdbcUrl(uri);
        dataSource1.setUser(username);
        dataSource1.setPassword(password);
        dataSource1.setDriverClass(sqlDriver);


        dataSource1.setMaxPoolSize(30);
        dataSource1.setInitialPoolSize(10);
        dataSource1.setAcquireIncrement(5);
        dataSource1.setMinPoolSize(5);

        return  dataSource1;
复制代码

tomcat的servlet中增加资源:

需要在配置参数的Context的标签下增加资源。在server.xml中或者在localhost的文件下的文件中。注意tomcat部署的时候重新设置了配置文件。要在增加的配置文件中设置。

<Resource name="mydbcp"
                    type="com.mchange.v2.c3p0.ComboPooledDataSource"
                    factory="org.apache.naming.factory.BeanFactory"


                    user="root"
                    password="123"
                    driverClass="com.mysql.jdbc.Driver"
                    jdbcUrl="jdbc:mysql://127.0.0.1:3306/mydb1"
                    maxPoolSize="20"
                    minPoolSize ="5"
                    initialPoolSize="10"
          />
复制代码

调用方法

Context initContext=new InitialContext();
         
            Context envContext=(Context)initContext.lookup("java:comp/env");
           
            DataSource dataSource1=(DataSource) envContext.lookup("mydbcp");

复制代码

ThreadLocal对象

ThreadLocal这相当于与一个map<Thread,T>其中Thread对象为Thread.currentThread()。就是各个线程的数据互不干涉。3个函数: 1.set() 2.get() 3、remove()

dbUtils数据包:

commons-dbutils-1.4.jar这个数据包是方便读写连接池的包。 1.把所有的数据都当成object,通过与配置命令进行update。

QueryRunner query1=new QueryRunner(MysqlC3P0Utils.getC3P0DataSource());
        String  sql="insert into emp2 values(?,?,?,?)";
        Object [] objects={2,"zhangbin","man",2};
        query1.update(sql, objects);
复制代码

处理过程如下:

int  manipulateDB(Connection connect1,String string,Object ... paras){

        try (
                PreparedStatement state=connect1.prepareStatement(string)
                ){

            setParas(state,paras);
            return state.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

    }
    
    
       private void setParas(PreparedStatement state, Object[] paras) throws SQLException {

        for(int i=0 ;i < paras.length;i++){
            state.setObject(i+1, paras[i]);
        }
    }
复制代码

2.读数据的时候,通过处理函数将result变量变为我们想要的对象。包提供了五中,我们也可以自己定义。

QueryRunner query1=new QueryRunner(MysqlC3P0Utils.getC3P0DataSource());
        String  sql="select * from  emp2 where id=?";
        Object [] objects={2};

        StuClass stu=query1.query(sql, new BeanHandler<StuClass>(StuClass.class),objects);
        System.out.println(stu);

  QueryRunner query1=new QueryRunner(MysqlC3P0Utils.getC3P0DataSource());
        String  sql="select * from  emp2 ";
//        Object [] objects={2};
        List<Map<String,Object>> map1=query1.query(sql, new MapListHandler());
        System.out.println(map1);



复制代码

分解形式如下:

interface  HandlerRS<T>{
    public  T handler(ResultSet rs) throws SQLException;
}

public  <T>T  queryDB(Connection connect1, String string, HandlerRS<T> hander, Object ... paras)
复制代码
  1. MapHandler:单行处理器!把结果集转换成Map<String,Object>,其中列名为键!
  2. MapListHandler:多行处理器!把结果集转换成List<Map<String,Object>>;
  3. BeanHandler:单行处理器!把结果集转换成Bean,该处理器需要Class参数,即Bean的类型;
  4. BeanListHandler:多行处理器!把结果集转换成List;
  5. ColumnListHandler:多行单列处理器!把结果集转换成List,使用ColumnListHandler时需要指定某一列的名称或编号,例如:new ColumListHandler(“name”)表示把name列的数据放到List中。
  6. ScalarHandler:单行单列处理器!把结果集转换成Object。一般用于聚集查询,例如select count(*) from tab_student。
    1. Naming的空间包。在servlet的加载中采用了,以后可以注意一下用法。是 java 的包。

以上所述就是小编给大家介绍的《sql相关知识:池、事务、serverlet中资源调用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

编程匠艺

编程匠艺

Pete Goodliffe / 韩江、陈玉 / 电子工业出版社 / 2011-11 / 85.00元

如果你可以编写出合格的代码,但是想更进一步、创作出组织良好而且易于理解的代码,并希望成为一名真正的编程专家或提高现有的职业技能,那么Pete Goodliffe编写的这本本书都会为你给出答案。本书的内容涵盖编程的各个要素,如代码风格、变量命名、错误处理和安全性等。此外,本书还对一些更广泛的编程问题进行了探讨,如有效的团队合作、开发过程和文档编写,等等。本书各章的末尾均提供一些思考问题,这些问题回顾......一起来看看 《编程匠艺》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具