JavaWeb基础知识总结. (48)

4个等级的事务隔离级别,在相同数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可以导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。

1 SERIALIZABLE(串行化)

l 不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的;

l 性能最差;

2 REPEATABLE READ(可重复读)

l 防止脏读和不可重复读;(不能处理幻读)

l 性能比SERIALIZABLE好

3 READ COMMITTED(读已提交数据)

l 防止脏读;(不能处理不可重复读、幻读)

l 性能比REPEATABLE READ好

4 READ UNCOMMITTED(读未提交数据)

l 可能出现任何事务并发问题

l 性能最好

MySQL的默认隔离级别为REPEATABLE READ,这是一个很不错的选择吧!

4 MySQL隔离级别

MySQL的默认隔离级别为Repeatable read,可以通过下面语句查看:

select @@tx_isolation

 

也可以通过下面语句来设置当前连接的隔离级别:

set transaction isolationlevel [4先1]

 
5 JDBC设置隔离级别

con. setTransactionIsolation(int level)

参数可选值如下:

l Connection.TRANSACTION_READ_UNCOMMITTED;

l Connection.TRANSACTION_READ_COMMITTED;

l Connection.TRANSACTION_REPEATABLE_READ;

l Connection.TRANSACTION_SERIALIZABLE。

事务总结:

l 事务的特性:ACID;

l 事务开始边界与结束边界:开始边界(con.setAutoCommit(false)),结束边界(con.commit()或con.rollback());

l 事务的隔离级别: READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE。多个事务并发执行时才需要考虑并发事务。

数据库连接池dbutil 数据库连接池 1 数据库连接池的概念

用池来管理Connection,这可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

wps8CD4.tmp

2 JDBC数据库连接池接口(DataSource)

Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商可以让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!

3 自定义连接池(ItcastPool)

分析:ItcastPool需要有一个List,用来保存连接对象。在ItcastPool的构造器中创建5个连接对象放到List中!当用人调用了ItcastPool的getConnection()时,那么就从List拿出一个返回。当List中没有连接可用时,抛出异常。

我们需要对Connection的close()方法进行增强,所以我们需要自定义ItcastConnection类,对Connection进行装饰!即对close()方法进行增强。因为需要在调用close()方法时把连接“归还”给池,所以ItcastConnection类需要拥有池对象的引用,并且池类还要提供“归还”的方法。

wps8CD5.tmp

ItcastPool.java

public class ItcastPool implements DataSource {

private static Properties props = new Properties();

private List<Connection> list = new ArrayList<Connection>();

static {

InputStream in = ItcastPool.class.getClassLoader()

.getResourceAsStream("dbconfig.properties");

try {

props.load(in);

Class.forName(props.getProperty("driverClassName"));

catch (Exception e) {

throw new RuntimeException(e);

}

}

public ItcastPool() throws SQLException {

for (int i = 0; i < 5; i++) {

Connection con = DriverManager.getConnection(

props.getProperty("url"), props.getProperty("username"),

props.getProperty("password"));

ItcastConnection conWapper = new ItcastConnection(con, this);

list.add(conWapper);

}

}

public void add(Connection con) {

list.add(con);

}

public Connection getConnection() throws SQLException {

if(list.size() > 0) {

return list.remove(0);

}

throw new SQLException("没连接了");

}

......

}

 

ItcastConnection.java

public class ItcastConnection extends ConnectionWrapper {

private ItcastPool pool;

public ItcastConnection(Connection con, ItcastPool pool) {

super(con);

this.pool = pool;

}

@Override

public void close() throws SQLException {

pool.add(this);

}

}

 
DBCP 1 什么是DBCP?

DBCP是Apache提供的一款开源免费的数据库连接池!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzfdw.html