事务相关

xiaoxiao2026-08-03  11

每一个线程对象创建好以后,jvm会为其分配一块内存空间, 用来存放当前线程对象独占数据,空间以Map形式存放独占 数据, Map<ThreadLocal,Object> 1) ThreadLocal<Connection> tl=new ThreadLocal<Connection>(); Connection conn=JdbcUtil.getConnection(); tl.set(conn); public class Thread{ ***********; Map<ThreadLocal,Object> getMap(){ ********* } } public class ThreadLocal<T>{ public T get(){ Map m=Thread.currentThread().getMap(); //currentThread()表示当前线程对象 return m.get(this); } public void set(T t){ Map m=Thread.currentThread().getMap(); m.put(this,t); } } ThreadLocal<Integer> ta=new ThreadLocal<Integer>() ta.set(new Integer(3)); save ----> update insert withdraw----> update insert transfer ---> update insert update insert update() insert() save---->update() insert(); dao: 1)对业务层屏蔽底层数据库设计的细节 2)o-r mapping import java.util.Properties; import java.io.*; public class JdbcUtil { private static Properties info=new Properties(); static{ try { InputStream is=JdbcUtil.class .getResourceAsStream("/com/kettas/jdbc/cfg/config.properties"); info.load(is); is.close(); } catch (Exception e) { throw new ExceptionInInitializerError(e); } } private static final ThreadLocal<Connection> tl=new ThreadLocal<Connection>(); public static Connection getConnection() throws Exception{ Connection conn=tl.get(); if(conn==null){ Class.forName(info.getProperty("driver")); conn=DriverManager.getConnection(info.getProperty("url"), info.getProperty("username"),info.getProperty("password")); tl.set(conn); } return conn; } public static void release(ResultSet rs,Statement stm,Connection conn){ if(rs!=null) try{ rs.close();} catch(Exception ee){} if(stm!=null) try{ stm.close();} catch(Exception ee){} if(conn!=null) try{ conn.close();} catch(Exception ee){} } public static void main(String[] args) throws Exception{ System.out.println(getConnection()); } public class TestPreparedStatement { public static void main(String[] args) { String[] names={"name6","name7","name8","name9","name10"}; String[] passwds={"111","222","333","444","555"}; String[] phones={"111","222","333","444","555"}; String[] emails={"111","222","333","444","555"}; Connection conn=null; //Statement stm=null; PreparedStatement pstm=null; try{ conn=JdbcUtil.getConnection(); String sql="insert into jdbc_users(id,name,passwd,phone,email)" +" values(jdbc_users_seq.nextval,?,?,?,?)"; pstm=conn.prepareStatement(sql); for(int i=0;i<names.length;i++){ pstm.setString(1, names[i]); pstm.setString(2, passwds[i]); pstm.setString(3, phones[i]); pstm.setString(4, emails[i]); pstm.executeUpdate(); } /*stm=conn.createStatement(); for(int i=0;i<names.length;i++){ String sql=" insert into jdbc_users(id,name,passwd,phone,email) " +" values(jdbc_users_seq.nextval,'"+names[i] +"','"+passwds[i]+"','"+phones[i]+"','"+emails[i] +"')"; System.out.println(sql); stm.executeUpdate(sql); System.out.println("====insert ok====="); }*/ }catch(Exception e){ e.printStackTrace(); }finally{ JdbcUtil.release(null, pstm, conn); } } } 1 PreparedStatement Statement stm=conn.createStatement(); stm.execute(sql); String sql="insert into table value(?,?,?); pstm=conn.prepareStatement(sql); pstm.set***(int,value); pstm.execute(); pstm同构sql,sql语句需要外界变量值 stm 异构sql 2 Transaction sqls,跟具体业务有关 ACID biz: try{ conn.setAutoCommit(false); conn.commit(); }catch(Exception e){ conn.rollback(); } 3 ThreadLocal 1)将Connection做成Thread的属性 通过参数的传递,保证一个线程一个连接 2)Thread t1-----> map(线程的独占的数据) Map: 主键ThreadLocal,无法直接获得Map对象 操作map只能通过ThreadLocal的set get操作 eg:让Thread对象独占一个Integer对象 Integer id=new Integer(3); ThreadLocal<Integer> tl=new ThreadLocal<Integer>(); tl.set(id); 1 javabean--->Student class Student{ private Integer id; private String name; private String sex; private String address; private int age; private String studentId; } 2 create table jdbc_student ( id number(7) primary key, name varchar2(15) not null, sex varchar2(3) check(sex in('f','m')), age number(3), address varchar2(20), studentid varchar2(15) not null unique ); 3 class StudentDao{ public void insert(Student s) throws Exception{ Connection conn=null; try{ conn=JdbcUtil.getConnection(); stm=.... sql="insert into......"; stm.execute(); s.setId(?); }finally{ JdbcUtil.release(...); } } public void update(Student s) throws Exception{} Repeatable read 重复读 select * from s_emp for update;行一级加锁 Serializable //表一级加锁 GetTransactionIsolation 获得当前数据库的隔离级别 Connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);设置隔离级别 Oracle默认级别为TRANSATION_READ_COMMITTED; 数据库的五个级别: TRANSACTION_NONE TRANSACTION_READ_UNCOMMTTED TRANSACTION_READ_COMMTTED 提交后读 TRANSACTION_REPEATABLE_READ 行一级加锁 可以阻止update,delete TRANSACTION_SERIALIZABLE 表一级加锁 可以阻止insert,update,delete 备份数据库提高效率策略: 1) 手动控制事务的大小,节约了db服务器的内存 减少了回滚带来损失 2) 事务结束时写日志,减少了查找失败事务的时间 3) 删除备份数据库表里的约束,减少数据进入时验证的时间 降低数据库服务器维护索引的资源 4) 降低数据库的隔离级别,设置到read uncommited 5) 插入时选择PreparedStatement,执行同构sql,减少编译 sql命令的时间
转载请注明原文地址: https://www.6miu.com/read-5050624.html

最新回复(0)