Servlet中jdbc应用高级篇之四

来源:互联网 发布:手机淘宝首页展示位置 编辑:程序博客网 时间:2024/05/20 05:27
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

  DBConnetionManager的构造函数是私有函数,以避免其他类创建其实例。

  privateDBConnectionManager(){

  init();

  }

  DBConnetionManager的客户调用getInstance()方法来得到该类的单一实例的引用。

  staticsynchronizedpublicDBConnectionManagergetInstance(){

  if(instance==null){

  instance=newDBConnectionManager();

  }

  clients++;

  returninstance;

  }

  单一的实例在第一次调用时创建,以后的调用返回该实例的静态应用。一个计数器纪录所有的客户数,直到客户释放引用。这个计数器在以后用来协调关闭连接池。

  一、初始化

  构造函数调用一个私有的init()函数初始化对象。

  privatevoidinit(){

  InputStreamis=getClass().getResourceAsStream("/db.properties");

  PropertiesdbProps=newProperties();

  try{

  dbProps.load(is);

  }

  catch(Exceptione){

  System.err.println("Cannotreadthepropertiesfile."+

  "Makesuredb.propertiesisintheCLASSPATH");

  return;

  }

  StringlogFile=dbProps.getProperty("logfile",

  "DBConnectionManager.log");

  try{

  log=newPrintWriter(newFileWriter(logFile,true),true);

  }

  catch(IOExceptione){

  System.err.println("Cannotopenthelogfile:"+logFile);

  log=newPrintWriter(System.err);

  }

  loadDrivers(dbProps);

  createPools(dbProps);

  }

  方法getResourceAsStream()是一个标准方法,用来打开一个外部输入文件。文件的位置取决于类加载器,而标准的类加载器从classpath开始搜索。Db.properties文件是一个Porperties格式的文件,保存在连接池中定义的key-value对。下面一些常用的属性可以定义:

  drivers以空格分开的jdbc驱动程序的列表

  logfile日志文件的绝对路径

  每个连接池中还使用另一些属性。这些属性以连接池的名字开头:

  .url数据库的jdbcURL

  .maxconn最大连接数。0表示无限。

  .user连接池的用户名

  .password相关的密码

  url属性是必须的,其他属性可选。用户名和密码必须和所定义的数据库匹配。

  下面是windows平台下的一个db.properties文件的例子。有一个InstantDB连接池和一个通过odbc连接的access数据库的数据源,名字叫demo。

  drivers=sun.jdbc.odbc.jdbcOdbcDriverjdbc.idbDriver

  logfile=D://user//src//java//DBConnectionManager//log.txt

  idb.url=jdbc:idb:c://local//javawebserver1.1//db//db.prp

  idb.maxconn=2

  access.url=jdbc:odbc:demo

  access.user=demo

  access.password=demopw

  注意,反斜线在windows平台下必须双写。

  初始化方法init()创建一个Porperties对象并装载db.properties文件,然后读取日志文件属性。如果日志文件没有命名,则使用缺省的名字DBConnectionManager.log在当前目录下创建。在此情况下,一个系统错误被纪录。

  方法loadDrivers()将指定的所有jdbc驱动程序注册,装载。

  privatevoidloadDrivers(Propertiesprops){

  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("Cannotregisterjdbcdriver:"+

  driverClassName+",Exception:"+e);

  }

  }

  }

  loadDrivers()使用StringTokenizer将dirvers属性分成单独的driver串,并将每个驱动程序装入java虚拟机。驱动程序的实例在jdbc的DriverManager中注册,并加入一个私有的向量drivers中。向量drivers用来关闭和注销所有的驱动程序。

  然后,DBConnectionPool对象由私有方法createPools()创建。

  privatevoidcreatePools(Propertiesprops){

  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);

  }

  }

  }

  一个枚举对象保存所有的属性名,如果属性名带有.url结尾,则表示是一个连接池对象需要被实例化。创建的连接池对象保存在一个Hashtable实例变量中。连接池名字作为索引,连

<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击