每一个线程对象创建好以后,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命令的时间
分享到:
相关推荐
MSSQL 2005 driver sqljdbc1.2.jar
sql server 2005 JDBC 驱动.rar 最新的2005的jdbc驱动,收集了好久才找到,测试能用
SQL连接java sqljdbc_1.2
最新的SQL 2005 JDBC驱动 1.2 内附帮助文档
sqljdbc是数据库驱动支持,java开发需要数据库连接时需导入此包。
java直连数据库的sql jdbc jar包 用于连接数据库
最近使用镜像时发现以前的版本有些问题。因此下载了此版本。 提供官方地址: ...http://download.microsoft.com/download/4/8/8/488E29DA-1E6A-48BC-900B-61FC62E152FD/sqljdbc_1.2.2828.100_cht.tar.gz
连接用例: driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; url = "jdbc:sqlserver://192.168.0.1:1433;DatabaseName=DbName";
sqljdbc_1.2+samples sqljdbc_1.2+samples sqljdbc_1.2+samples sqljdbc_1.2+samples sqljdbc_1.2+samples sqljdbc_1.2+samples
JDBC Driver 驱动 sqlserver
java运行依赖jar包
spring1.2的配置-jdbcspring1.2的配置-jdbcspring1.2的配置-jdbcspring1.2的配置-jdbc
sqljdbc1.1、sqljdbc1.2、sqljdbc2.0
Microsoft SQL Server 2005 JDBC Driver1.2
log4jdbc jar包,你懂的,关于sql的?,值可先显示
标签:activemq-store-jdbc-1.2.jar.zip,activemq,store,jdbc,1.2,jar.zip包下载,依赖包
SQL Server 2005 JDBC Driver 1.2 for unix 这个没有做测试,因此不能确定链接可行性,但是for windows 一定是可以使用的!
SQL Server 2005 JDBC 驱动 压缩包内包含三个jar文件,分别是三个版本,我用的sqljdbc1.2.jar,使用的时候需要注意的是2000与2005的url和驱动全限定名是不同的