仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 935|回复: 18
打印 上一主题 下一主题

[学习教程] JAVA教程之db pool的复杂的例子

[复制链接]
冷月葬花魂 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:39:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
诸如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:57 | 只看该作者
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
深爱那片海 该用户已被删除
板凳
发表于 2015-1-25 12:37:04 | 只看该作者
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
冷月葬花魂 该用户已被删除
地板
 楼主| 发表于 2015-1-25 13:51:43 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
第二个灵魂 该用户已被删除
5#
发表于 2015-1-29 22:03:41 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
6#
发表于 2015-1-31 13:54:39 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
飘灵儿 该用户已被删除
7#
发表于 2015-2-1 12:07:17 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
若相依 该用户已被删除
8#
发表于 2015-2-2 14:32:13 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
因胸联盟 该用户已被删除
9#
发表于 2015-2-7 22:23:51 | 只看该作者
你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。
爱飞 该用户已被删除
10#
发表于 2015-2-24 04:43:22 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
不帅 该用户已被删除
11#
发表于 2015-2-26 17:37:01 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
admin 该用户已被删除
12#
发表于 2015-3-3 02:56:55 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
分手快乐 该用户已被删除
13#
发表于 2015-3-11 08:59:30 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
小女巫 该用户已被删除
14#
发表于 2015-3-18 01:19:03 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
只想知道 该用户已被删除
15#
发表于 2015-3-24 19:10:26 | 只看该作者
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
精灵巫婆 该用户已被删除
16#
发表于 2015-4-5 11:20:12 | 只看该作者
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
蒙在股里 该用户已被删除
17#
发表于 2015-4-8 14:58:37 | 只看该作者
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
再现理想 该用户已被删除
18#
发表于 2015-4-11 07:57:30 | 只看该作者
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
金色的骷髅 该用户已被删除
19#
发表于 2015-4-26 02:47:54 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表