仓酷云

标题: JAVA网站制作之一种完成数据库毗连池的办法(3) [打印本页]

作者: 变相怪杰    时间: 2015-1-18 11:39
标题: JAVA网站制作之一种完成数据库毗连池的办法(3)
其实你不用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#程序员都明白一点
作者: 愤怒的大鸟    时间: 2015-1-21 12:20
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者: 小妖女    时间: 2015-1-25 18:46
当然你也可以参加一些开源项目,一方面可以提高自己,另一方面也是为中国软件事业做贡献嘛!开发者在互联网上用CVS合作开发,用QQ,MSN,E-mail讨论联系,天南海北的程序员分散在各地却同时开发同一个软件,是不是很有意思呢?
作者: 兰色精灵    时间: 2015-2-3 13:12
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者: 小女巫    时间: 2015-2-7 02:51
是一种使网页(Web Page)产生生动活泼画面的语言
作者: 柔情似水    时间: 2015-2-7 17:48
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
作者: 山那边是海    时间: 2015-2-16 13:46
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 透明    时间: 2015-3-2 16:20
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 莫相离    时间: 2015-3-7 13:20
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
作者: 乐观    时间: 2015-3-8 17:48
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 变相怪杰    时间: 2015-3-8 18:52
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 爱飞    时间: 2015-3-11 00:39
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 若天明    时间: 2015-3-17 17:08
任职于太阳微系统的詹姆斯·高斯林等人于1990年代初开发Java语言的雏形,最初被命名为Oak,目标设置在家用电器等小型系统的程序语言
作者: 小魔女    时间: 2015-3-17 17:08
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 若相依    时间: 2015-3-17 17:08
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
作者: 再见西城    时间: 2015-3-17 17:08
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 因胸联盟    时间: 2015-3-17 17:08
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者: 蒙在股里    时间: 2015-3-17 17:08
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 仓酷云    时间: 2015-3-17 17:08
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 海妖    时间: 2015-3-20 22:41
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2