仓酷云
标题:
JAVA教程之db pool的复杂的例子
[打印本页]
作者:
冷月葬花魂
时间:
2015-1-18 11:39
标题:
JAVA教程之db pool的复杂的例子
诸如RMI,EJB等一些技术并不是你说的那么复杂,而是它们把一些复杂的工具封装成不复杂的工具了,理解这些工具是需要些时间。我问你,.net里有这些工具吗?要简单多少?。publicclassOracleConnectionManager{
privateDBConnectionManagerconnMgr;
privatefinalStringpoolName="Oracle";
privateConnectionconn;
publicOracleConnectionManager(){
StringuserID="system";
Stringpassword="manager";
StringJDBCDriver="oracle.jdbc.driver.OracleDriver";
StringJDBCDriverType="jdbc:oracle:thin";
StringDBHost="127.0.0.1";
StringPort="1521";
StringSID="sid";
Stringurl=JDBCDriverType+":@"+DBHost+":"+Port+":"+SID;
connMgr=DBConnectionManager.getInstance();
if(DBConnectionManager.clients==1){
connMgr.init(poolName,JDBCDriver,url,userID,password);
connMgr.init("egongOracle",JDBCDriver,JDBCDriverType+":@110.7.6.22:1521:egong","abcusername","abcpasswd");
}
}
publicConnectiongetConnection(){
return(conn=connMgr.getConnection(poolName));
}
publicConnectiongetConnection(StringnewOracle){
return(conn=connMgr.getConnection(newOracle));
}
publicvoidfreeConnection(){
connMgr.freeConnection(poolName,conn);
}
publicvoidfreeConnection(StringnewOracle){
connMgr.freeConnection(newOracle,conn);
}
}
publicclassDBConnectionManager{
staticprivateDBConnectionManagerinstance=null;//Thesingleinstance
staticpublicintclients=0;
privateVectordrivers=newVector();
privatePrintWriterlog;
privateHashtablepools=newHashtable();
privatefinalintMAX_CONN=1000;
/**
*Returnsthesingleinstance,creatingoneifitsthe
*firsttimethismethodiscalled.
*
*@returnDBConnectionManagerThesingleinstance.
*/
staticsynchronizedpublicDBConnectionManagergetInstance(){
if(instance==null){
instance=newDBConnectionManager();
}
clients++;
returninstance;
}
/**
*AprivateconstructorsincethisisaSingleton
*/
privateDBConnectionManager(){
//init();
}
/**
*Returnsaconnectiontothenamedpool.
*
*@paramnameThepoolnameasdefinedinthepropertiesfile
*@paramconTheConnection
*/
publicvoidfreeConnection(Stringname,Connectioncon){
DBConnectionPoolpool=(DBConnectionPool)pools.get(name);
if(pool!=null){
pool.freeConnection(con);
}
}
/**
*Returnsanopenconnection.Ifnooneisavailable,andthemax
*numberofconnectionshasnotbeenreached,anewconnectionis
*created.
*
*@paramnameThepoolnameasdefinedinthepropertiesfile
*@returnConnectionTheconnectionornull
*/
publicConnectiongetConnection(Stringname){
DBConnectionPoolpool=(DBConnectionPool)pools.get(name);
if(pool!=null){
returnpool.getConnection();
}
returnnull;
}
/**
*Returnsanopenconnection.Ifnooneisavailable,andthemax
*numberofconnectionshasnotbeenreached,anewconnectionis
*created.Ifthemaxnumberhasbeenreached,waitsuntilone
*isavailableorthespecifiedtimehaselapsed.
*
*@paramnameThepoolnameasdefinedinthepropertiesfile
*@paramtimeThenumberofmillisecondstowait
*@returnConnectionTheconnectionornull
*/
publicConnectiongetConnection(Stringname,longtime){
DBConnectionPoolpool=(DBConnectionPool)pools.get(name);
if(pool!=null){
returnpool.getConnection(time);
}
returnnull;
}
/**
*Closesallopenconnectionsandderegistersalldrivers.
*/
publicsynchronizedvoidrelease(){
//Waituntilcalledbythelastclient
if(--clients!=0){
return;
}
EnumerationallPools=pools.elements();
while(allPools.hasMoreElements()){
DBConnectionPoolpool=(DBConnectionPool)allPools.nextElement();
pool.release();
}
EnumerationallDrivers=drivers.elements();
while(allDrivers.hasMoreElements()){
Driverdriver=(Driver)allDrivers.nextElement();
try{
DriverManager.deregisterDriver(driver);
log("DeregisteredJDBCdriver"+driver.getClass().getName());
}
catch(SQLExceptione){
log(e,"CantderegisterJDBCdriver:"+driver.getClass().getName());
}
}
log.close();
}
/**
*CreatesinstancesofDBConnectionPoolbasedontheproperties.
*ADBConnectionPoolcanbedefinedwiththefollowingproperties:
*<PRE>
*<poolname>.urlTheJDBCURLforthedatabase
*<poolname>.userAdatabaseuser(optional)
*<poolname>.passwordAdatabaseuserpassword(ifuserspecified)
*<poolname>.maxconnThemaximalnumberofconnections(optional)
*</PRE>
*
*@parampropsTheconnectionpoolproperties
*/
privatevoidcreatePools(StringpoolName,Stringurl,Stringuser,Stringpassword,intmax){
/*
EnumerationpropNames=props.propertyNames();
while(propNames.hasMoreElements()){
Stringname=(String)propNames.nextElement();
if(name.endsWith(".url")){
StringpoolName=name.substring(0,name.lastIndexOf("."));
Stringurl=props.getProperty(poolName+".url");
if(url==null){
log("NoURLspecifiedfor"+poolName);
continue;
}
Stringuser=props.getProperty(poolName+".user");
Stringpassword=props.getProperty(poolName+".password");
Stringmaxconn=props.getProperty(poolName+".maxconn","0");
intmax;
try{
max=Integer.valueOf(maxconn).intValue();
}
catch(NumberFormatExceptione){
log("Invalidmaxconnvalue"+maxconn+"for"+poolName);
max=0;
}
DBConnectionPoolpool=
newDBConnectionPool(poolName,url,user,password,max);
pools.put(poolName,pool);
log("Initializedpool"+poolName);
}
}
*/
DBConnectionPoolpool=
newDBConnectionPool(poolName,url,user,password,max);
pools.put(poolName,pool);
log("Initializedpool"+poolName);
}
publicvoidinit(StringpoolName,Stringdriver,Stringurl,Stringuser,Stringpasswd){
init(poolName,driver,url,user,passwd,MAX_CONN);
}
/**
*Loadspropertiesandinitializestheinstancewithitsvalues.
*/
publicvoidinit(StringpoolName,Stringdriver,Stringurl,Stringuser,Stringpasswd,intmaxconn){
/*
InputStreamis=getClass().getResourceAsStream("/db.properties");
PropertiesdbProps=newProperties();
try{
dbProps.load(is);
}
catch(Exceptione){
System.err.println("Cantreadthepropertiesfile."+
"Makesuredb.propertiesisintheCLASSPATH");
return;
}
StringlogFile=dbProps.getProperty("logfile","DBConnectionManager.log");
StringlogFile="."+File.separator+"logs"+File.separator+"dbpool";
try{
log=newPrintWriter(newFileWriter(logFile,true),true);
}
catch(IOExceptione){
System.err.println("Cantopenthelogfile:"+logFile);
log=newPrintWriter(System.err);
}
*/
log=newPrintWriter(System.err);
loadDrivers(driver);
createPools(poolName,url,user,passwd,maxconn);
}
/**
*LoadsandregistersallJDBCdrivers.Thisisdonebythe
*DBConnectionManager,asopposedtotheDBConnectionPool,
*sincemanypoolsmaysharethesamedriver.
*
*@parampropsTheconnectionpoolproperties
*/
privatevoidloadDrivers(StringdriverClassName){
/*
StringdriverClasses=props.getProperty("drivers");
StringTokenizerst=newStringTokenizer(driverClasses);
while(st.hasMoreElements()){
StringdriverClassName=st.nextToken().trim();
try{
Driverdriver=(Driver)
Class.forName(driverClassName).newInstance();
DriverManager.registerDriver(driver);
drivers.addElement(driver);
log("RegisteredJDBCdriver"+driverClassName);
}
catch(Exceptione){
log("CantregisterJDBCdriver:"+
driverClassName+",Exception:"+e);
}
}
*/
try{
Driverdriver=(Driver)
Class.forName(driverClassName).newInstance();
DriverManager.registerDriver(driver);
drivers.addElement(driver);
log("RegisteredJDBCdriver"+driverClassName);
}
catch(Exceptione){
log("CantregisterJDBCdriver:"+
driverClassName+",Exception:"+e);
}
}
/**
*Writesamessagetothelogfile.
*/
privatevoidlog(Stringmsg){
log.println(newDate()+":"+msg);
}
/**
*WritesamessagewithanExceptiontothelogfile.
*/
privatevoidlog(Throwablee,Stringmsg){
log.println(newDate()+":"+msg);
e.printStackTrace(log);
}
/**
*Thisinnerclassrepresentsaconnectionpool.Itcreatesnew
*connectionsondemand,uptoamaxnumberifspecified.
*Italsomakessureaconnectionisstillopenbeforeitis
*returnedtoaclient.
*/
classDBConnectionPool{
privateintcheckedOut;
privateVectorfreeConnections=newVector();
privateintmaxConn;
privateStringname;
privateStringpassword;
privateStringURL;
privateStringuser;
/**
*Createsnewconnectionpool.
*
*@paramnameThepoolname
*@paramURLTheJDBCURLforthedatabase
*@paramuserThedatabaseuser,ornull
*@parampasswordThedatabaseuserpassword,ornull
*@parammaxConnThemaximalnumberofconnections,or0
*fornolimit
*/
publicDBConnectionPool(Stringname,StringURL,Stringuser,Stringpassword,
intmaxConn){
this.name=name;
this.URL=URL;
this.user=user;
this.password=password;
this.maxConn=maxConn;
}
/**
*Checksinaconnectiontothepool.NotifyotherThreadsthat
*maybewaitingforaconnection.
*
*@paramconTheconnectiontocheckin
*/
publicsynchronizedvoidfreeConnection(Connectioncon){
//PuttheconnectionattheendoftheVector
freeConnections.addElement(con);
checkedOut--;
notifyAll();
}
/**
*Checksoutaconnectionfromthepool.Ifnofreeconnection
*isavailable,anewconnectioniscreatedunlessthemax
*numberofconnectionshasbeenreached.Ifafreeconnection
*hasbeenclosedbythedatabase,itsremovedfromthepool
*andthismethodiscalledagainrecursively.
*/
publicsynchronizedConnectiongetConnection(){
Connectioncon=null;
if(freeConnections.size()>0){
//PickthefirstConnectionintheVector
//togetround-robinusage
con=(Connection)freeConnections.firstElement();
freeConnections.removeElementAt(0);
try{
if(con.isClosed()){
log("Removedbadconnectionfrom"+name);
//Tryagainrecursively
con=getConnection();
}
}
catch(SQLExceptione){
log("Removedbadconnectionfrom"+name);
//Tryagainrecursively
con=getConnection();
}
}
elseif(maxConn==0||checkedOut<maxConn){
con=newConnection();
}
if(con!=null){
checkedOut++;
}
returncon;
}
/**
*Checksoutaconnectionfromthepool.Ifnofreeconnection
*isavailable,anewconnectioniscreatedunlessthemax
*numberofconnectionshasbeenreached.Ifafreeconnection
*hasbeenclosedbythedatabase,itsremovedfromthepool
*andthismethodiscalledagainrecursively.
*<P>
*Ifnoconnectionisavailableandthemaxnumberhasbeen
*reached,thismethodwaitsthespecifiedtimeforonetobe
*checkedin.
*
*@paramtimeoutThetimeoutvalueinmilliseconds
*/
publicsynchronizedConnectiongetConnection(longtimeout){
longstartTime=newDate().getTime();
Connectioncon;
while((con=getConnection())==null){
try{
wait(timeout);
}
catch(InterruptedExceptione){}
if((newDate().getTime()-startTime)>=timeout){
//Timeouthasexpired
returnnull;
}
}
returncon;
}
/**
*Closesallavailableconnections.
*/
publicsynchronizedvoidrelease(){
EnumerationallConnections=freeConnections.elements();
while(allConnections.hasMoreElements()){
Connectioncon=(Connection)allConnections.nextElement();
try{
con.close();
log("Closedconnectionforpool"+name);
}
catch(SQLExceptione){
log(e,"Cantcloseconnectionforpool"+name);
}
}
freeConnections.removeAllElements();
}
/**
*Createsanewconnection,usingauseridandpassword
*ifspecified.
*/
privateConnectionnewConnection(){
Connectioncon=null;
try{
if(user==null){
con=DriverManager.getConnection(URL);
}
else{
con=DriverManager.getConnection(URL,user,password);
}
log("Createdanewconnectioninpool"+name);
}
catch(SQLExceptione){
log(e,"Cantcreateanewconnectionfor"+URL);
returnnull;
}
returncon;
}
}
}
你通过从书的数量和开发周期及运行速度来证明:net和ruby要比java简单。
作者:
乐观
时间:
2015-1-21 12:22
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者:
深爱那片海
时间:
2015-1-25 12:37
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者:
冷月葬花魂
时间:
2015-1-25 13:51
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者:
第二个灵魂
时间:
2015-1-29 22:03
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者:
仓酷云
时间:
2015-1-31 13:54
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者:
飘灵儿
时间:
2015-2-1 12:07
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者:
若相依
时间:
2015-2-2 14:32
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者:
因胸联盟
时间:
2015-2-7 22:23
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
作者:
爱飞
时间:
2015-2-24 04:43
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者:
不帅
时间:
2015-2-26 17:37
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者:
admin
时间:
2015-3-3 02:56
是一种将安全性(Security)列为第一优先考虑的语言
作者:
分手快乐
时间:
2015-3-11 08:59
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
作者:
小女巫
时间:
2015-3-18 01:19
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者:
只想知道
时间:
2015-3-24 19:10
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者:
精灵巫婆
时间:
2015-4-5 11:20
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
作者:
蒙在股里
时间:
2015-4-8 14:58
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者:
再现理想
时间:
2015-4-11 07:57
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者:
金色的骷髅
时间:
2015-4-26 02:47
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2