|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。数据|数据库|数据库毗连DataSourceImpl是一个完成了接口javax.sql.DataSource的类,该类保护着一个毗连池的对象。因为该类是一个受回护的类,因而它表露给利用者的办法只要接口DataSource中界说的办法,其他的一切办法对利用者来讲都是不成视的。我们先来体贴用户可会见的一个办法getConnection
/**
*@seejavax.sql.DataSource#getConnection(String,String)
*/
publicConnectiongetConnection(Stringuser,Stringpassword)throwsSQLException
{
//起首从毗连池中找出余暇的对象
Connectionconn=getFreeConnection(0);
if(conn==null){
//判别是不是凌驾最年夜毗连数,假如凌驾最年夜毗连数
//则守候必定工夫检察是不是有余暇毗连,不然抛出非常告知用户无可用毗连
if(getConnectionCount()>=connParam.getMaxConnection())
conn=getFreeConnection(connParam.getWaitTime());
else{//没有凌驾毗连数,从头猎取一个数据库的毗连
connParam.setUser(user);
connParam.setPassword(password);
Connectionconn2=DriverManager.getConnection(connParam.getUrl(),
user,password);
//代办署理将要前往的毗连对象
_Connection_conn=new_Connection(conn2,true);
synchronized(conns){
conns.add(_conn);
}
conn=_conn.getConnection();
}
}
returnconn;
}
/**
*从毗连池中取一个余暇的毗连
*@paramnTimeout假如该参数值为0则没有毗连时只是前往一个null
*不然的话守候nTimeout毫秒看是不是另有余暇毗连,假如没有抛出非常
*@returnConnection
*@throwsSQLException
*/
protectedsynchronizedConnectiongetFreeConnection(longnTimeout)
throwsSQLException
{
Connectionconn=null;
Iteratoriter=conns.iterator();
while(iter.hasNext()){
_Connection_conn=(_Connection)iter.next();
if(!_conn.isInUse()){
conn=_conn.getConnection();
_conn.setInUse(true);
break;
}
}
if(conn==null&&nTimeout>0){
//守候nTimeout毫秒以便看是不是有余暇毗连
try{
Thread.sleep(nTimeout);
}catch(Exceptione){}
conn=getFreeConnection(0);
if(conn==null)
thrownewSQLException("没有可用的数据库毗连");
}
returnconn;
}
DataSourceImpl类中完成getConnection办法的跟一般的数据库毗连池的逻辑是分歧的,起首判别是不是有余暇的毗连,假如没有的话判别毗连数是不是已凌驾最年夜毗连数等等的一些逻辑。可是有一点分歧的是经由过程DriverManager失掉的数据库毗连并非实时前往的,而是经由过程一个叫_Connection的类中介一下,然后挪用_Connection.getConnection前往的。假如我们没有经由过程一其中介也就是JAVA中的Proxy来接受要前往的接口对象,那末我们就没有举措截住Connection.close办法。
终究到了中心地点,我们先来看看_Connection是怎样完成的,然后再先容是客户端挪用Connection.close办法时走的是如何一个流程,为何并没有真实的封闭毗连。
/**
*数据毗连的自封装,屏障了close办法
*@authorLiudong
*/
class_ConnectionimplementsInvocationHandler
{
privatefinalstaticStringCLOSE_METHOD_NAME="close";
privateConnectionconn=null;
//数据库的忙形态
privatebooleaninUse=false;
//用户最初一次会见该毗连办法的工夫
privatelonglastAccessTime=System.currentTimeMillis();
_Connection(Connectionconn,booleaninUse){
this.conn=conn;
this.inUse=inUse;
}
/**
*Returnstheconn.
*@returnConnection
*/
publicConnectiongetConnection(){
//前往数据库毗连conn的接受类,以便截住close办法
Connectionconn2=(Connection)Proxy.newProxyInstance(
conn.getClass().getClassLoader(),
conn.getClass().getInterfaces(),this);
returnconn2;
}
/**
*该办法真实的封闭了数据库的毗连
*@throwsSQLException
*/
voidclose()throwsSQLException{
//因为类属性conn是没有被接受的毗连,因而一旦挪用close办法后就间接封闭毗连
conn.close();
}
/**
*ReturnstheinUse.
*@returnboolean
*/
publicbooleanisInUse(){
returninUse;
}
/**
*@seejava.lang.reflect.InvocationHandler#invoke(java.lang.Object,java.lang.reflect.Method,java.lang.Object)
*/
publicObjectinvoke(Objectproxy,Methodm,Object[]args)
throwsThrowable
{
Objectobj=null;
//判别是不是挪用了close的办法,假如挪用close办法则把毗连置为无用形态
if(CLOSE_METHOD_NAME.equals(m.getName()))
setInUse(false);
else
obj=m.invoke(conn,args);
//设置最初一次会见工夫,以便实时扫除超时的毗连
lastAccessTime=System.currentTimeMillis();
returnobj;
}
/**
*ReturnsthelastAccessTime.
*@returnlong
*/
publiclonggetLastAccessTime(){
returnlastAccessTime;
}
/**
*SetstheinUse.
*@paraminUseTheinUsetoset
*/
publicvoidsetInUse(booleaninUse){
this.inUse=inUse;
}
}
一旦利用者挪用所失掉毗连的close办法,因为用户的毗连对象是经由接受后的对象,因而JAVA假造时机起首挪用_Connection.invoke办法,在该办法中起首判别是不是为close办法,假如不是则将代码转给真实的没有被接受的毗连对象conn。不然的话只是复杂的将该毗连的形态设置为可用。到此您大概就分明了全部接受的历程,可是同时也有一个疑问:如许的话是否是这些已创建的毗连就一直没有举措真正封闭?谜底是能够的。我们来看看ConnectionFactory.unbind办法,该办法起首找到名字对应的毗连池对象,然后封闭该毗连池中的一切毗连并删撤除毗连池。在DataSourceImpl类中界说了一个close办法用来封闭一切的毗连,具体代码以下:
/**
*封闭该毗连池中的一切数据库毗连
*@returnint前往被封闭毗连的个数
*@throwsSQLException
*/
publicintclose()throwsSQLException
{
intcc=0;
SQLExceptionexcp=null;
Iteratoriter=conns.iterator();
while(iter.hasNext()){
try{
((_Connection)iter.next()).close();
cc++;
}catch(Exceptione){
if(einstanceofSQLException)
excp=(SQLException)e;
}
}
if(excp!=null)
throwexcp;
returncc;
}
该办法逐一挪用毗连池中每一个对象的close办法,这个close办法对应的是_Connection中对close的完成,在_Connection界说中封闭数据库毗连的时分是间接挪用没有经由接受的对象的封闭办法,因而该close办法真实的开释了数据库资本。
以上笔墨只是形貌了接口办法的接受,详细一个有用的毗连池模块还必要对余暇毗连的监控并实时开释毗连,具体的代码请参照附件。
Java的B/s开发是通常是javaweb开发,又叫J2EE开发,J2SE是手机开发。C#的C/s和B/s开发是说.net和Asp开发。。u在这里说明一点;资深一点的Java和C#程序员都明白一点 |
|