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

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

内容简介:所以一些默认的,只需要执行一次的方法,可以放到静态块中。例如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中资源调用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

The Black Box Society

The Black Box Society

Frank Pasquale / Harvard University Press / 2015-1-5 / USD 35.00

Every day, corporations are connecting the dots about our personal behavior—silently scrutinizing clues left behind by our work habits and Internet use. The data compiled and portraits created are inc......一起来看看 《The Black Box Society》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

随机密码生成器
随机密码生成器

多种字符组合密码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试