每一个线程对象创建好以后,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命令的时间