`
阅读更多

  每一个线程对象创建好以后,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只能通过ThreadLocalset 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   行一级加锁  可以阻止updatedelete

TRANSACTION_SERIALIZABLE      表一级加锁  可以阻止insertupdatedelete

 

 

  备份数据库提高效率策略:

   1) 手动控制事务的大小,节约了db服务器的内存

      减少了回滚带来损失

   2) 事务结束时写日志,减少了查找失败事务的时间

   3) 删除备份数据库表里的约束,减少数据进入时验证的时间

      降低数据库服务器维护索引的资源

   4) 降低数据库的隔离级别,设置到read uncommited

   5) 插入时选择PreparedStatement,执行同构sql,减少编译

      sql命令的时间 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics