日期:2014-05-16 浏览次数:20643 次
log:打印日志(废话)
callback: 回调类:在 打开连接,关闭连接,事务状态时机定义动作
factory:供应ConnectionProvider以提供连接,Batch以管理Statement
releaseMode:释放模式
connection:连接缓存
borrowedConnection:连用连接缓存
wasConnectionSupplied:提供的连接是被客户端提供的而非ConnectionProvider
batcher:管理Statement
interceptor:拦截器,给batcher用
isClosed:该类实例是否关闭
isFlushing:改状态值是为了解决一次flush中发多条Statement时,重复释放连接问题
可以把session与connection的使用关系分为三种
session使用的连接是被提供的,常常SessionFactory.openSession(connection,Interceptor?)
session使用的连接被借给客户端,常常session.connection
session通过connectionProvider.getConnection得到的连接
如果session使用的连接是被提供的,那么当之后调用session.connection向session借取的连接就是之前被提供的连接,这类型的连接释放模式必须是ON_CLOSE,但即使这样,连接也不能由session关闭之后而关闭,既然是被提供的,当然生命周期不必与Session同步
如果session使用的连接是通过connectionprovider得到,并被提供给客户端,那么此时的客户端得到的是一个代理连接(被代理的对象正是connectionprovider获取的),当调用代理连接的close方法,并不能关闭被代理的连接,只是标识缓存中的borrowedConnection为空并设置代理连接不可用,因为既然是借用session的,当然不能够擅自了结连接。
如果session使用的连接是通过connectionprovider得到,那么连接的释放遵守ConnectionReleaseMode定义
释放操作执行
如果调用batch批量关闭,则设置releasing=true,批量关闭完成之后设置为false,对于每条Statement的关闭,总是检查如果releasing!=true(显然不成立),不会执行afterStatement,场景
事务环境的事务完成后调用
非事务环境查询
session.close
session.disconnect
如果非批量关闭,对于每条Statement,显然总是执行afterStatement;
调用afterStatement并不能保证连接立即关闭,下列条件都必须满足
releaseMode等于AFTER_STATEMENT或者非事务环境下的自动提交模式
flushing=false 在session.flush或执行自动刷新时(比如FlushMode.ALWAYS),执行flushBeginning时flushing 设置为 true;尚未flush完成即没执行flushEnding(设置flushing=false)不行,必须执行完flushEnding
由batch管理的Statement和ResultSet全被关闭掉
连接没被借出去或被借出去之后关闭掉的
当事务完成之后或非事务查询时都会调用afterTransaction,以下条件之一满足即可关闭连接
releaseMode等于AFTER_TRANSACTION
releaseMode等于AFTER_STATEMENT并且batch还有未关闭的Statement和ResultSet:同时关闭尚未处理的Statement和ResultSet
// $Id: ConnectionManager.java 11304 2007-03-19 22:06:45Z steve.ebersole@jboss.com $
package org.hibernate.jdbc;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.ConnectionReleaseMode;
import org.hibernate.HibernateException;
import org.hibernate.Interceptor;
import org.hibernate.engine.SessionFactoryImplementor;
import org.hibernate.exception.JDBCExceptionHelper;
import org.hibernate.util.JDBCExceptionReporter;
/**
* Encapsulates JDBC Connection management logic needed by Hibernate.
* <p/>
* The lifecycle is intended to span a logical series of interactions with the
* database. Internally, this means the the lifecycle of the Session.
*
* @author Steve Ebersole
*/
public class ConnectionManager implements Serializable {
private static final Log log = LogFactory.getLog( ConnectionManager.class );
public static interface Callback {
public void connectionOpened();
public void connectionCleanedUp();
public boolean isTransactionInProgress();
}
private transient SessionFactoryImplementor factory;
private final Callback callback;
private final ConnectionReleaseMode releaseMode;
private transient Connection connection;
private transient Connection borrowedConnection;
private final boolean wasConnectionSupplied;
private transient Batcher batcher;
private transient Interceptor interceptor;
private boolean isClosed;
private transient boolean isFlushing;
/**
* Constructs a ConnectionManager.
* <p/>
* This is the form used internally.
*
* @param factory The SessionFactory.
* @param callback An observer for internal state change.
* @param releaseMode The mode by which to release JDBC connections.
* @param connection An externally supplied connection.
*/
public ConnectionManager(
SessionFactoryImplementor factory,
Callback callback,
ConnectionReleaseMode releaseMode,
Connection connection,
Interceptor interceptor) {
this.factory = factory;
t