Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1503314
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 20:17:55

一起学习
DBConnetionManager的构造函数是私有函数,以避免其他类创建其实例。 private DBConnectionManager() { init(); }   DBConnetionManager的客户调用getInstance()方法来得到该类的单一实例的引用。 static synchronized public DBConnectionManager getInstance() { if (instance == null) { instance = new DBConnectionManager(); } clients ; return instance; }   单一的实例在第一次调用时创建,以后的调用返回该实例的静态应用。一个计数器纪录所有的客户数,直到客户释放引用。这个计数器在以后用来协调关闭连接池。   一、初始化   构造函数调用一个私有的init()函数初始化对象。 private void init() { InputStream is = getClass().getResourceAsStream("/db.properties"); Properties dbProps = new Properties(); try { dbProps.load(is); } catch (Exception e) { System.err.println("Can not read the properties file. " "Make sure db.properties is in the CLASSPATH"); return; } String logFile = dbProps.getProperty("logfile", "DBConnectionManager.log"); try { log = new PrintWriter(new FileWriter(logFile, true), true); } catch (IOException e) { System.err.println("Can not open the log file: " logFile); log = new PrintWriter(System.err); } loadDrivers(dbProps); createPools(dbProps); }   方法getResourceAsStream()是一个标准方法,用来打开一个外部输入文件。文件的位置取决于类加载器,而标准的类加载器从classpath开始搜索。Db.properties文件是一个Porperties格式的文件,保存在连接池中定义的key-value对。下面一些常用的属性可以定义:    drivers 以空格分开的jdbc驱动程序的列表    logfile 日志文件的绝对路径   每个连接池中还使用另一些属性。这些属性以连接池的名字开头:    .url数据库的JDBC URL    .maxconn最大连接数。0表示无限。    .user连接池的用户名    .password相关的密码   url属性是必须的,其他属性可选。用户名和密码必须和所定义的数据库匹配。   下面是windows平台下的一个db.properties文件的例子。有一个InstantDB连接池和一个通过odbc连接的access数据库的数据源,名字叫demo。 drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.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驱动程序注册,装载。 private void loadDrivers(Properties props) { String driverClasses = props.getProperty("drivers"); StringTokenizer st = new StringTokenizer(driverClasses); while (st.hasMoreElements()) { String driverClassName = st.nextToken().trim(); try { Driver driver = (Driver) Class.forName(driverClassName).newInstance(); DriverManager.registerDriver(driver); drivers.addElement(driver); log("Registered JDBC driver " driverClassName); } catch (Exception e) { log("Can not register JDBC driver: " driverClassName ", Exception: " e); } } }   loadDrivers()使用StringTokenizer将dirvers属性分成单独的driver串,并将每个驱动程序装入java虚拟机。驱动程序的实例在JDBC 的DriverManager中注册,并加入一个私有的向量drivers中。向量drivers用来关闭和注销所有的驱动程序。   然后,DBConnectionPool对象由私有方法createPools()创建。 private void createPools(Properties props) { Enumeration propNames = props.propertyNames(); while (propNames.hasMoreElements()) { String name = (String) propNames.nextElement(); if (name.endsWith(".url")) { String poolName = name.substring(0, name.lastIndexOf(".")); String url = props.getProperty(poolName ".url"); if (url == null) { log("No URL specified for " poolName); continue; } String user = props.getProperty(poolName ".user"); String password = props.getProperty(poolName ".password"); String maxconn = props.getProperty(poolName ".maxconn", "0"); int max; try { max = Integer.valueOf(maxconn).intValue(); } catch (NumberFormatException e) { log("Invalid maxconn value " maxconn " for " poolName); max = 0; } DBConnectionPool pool = new DBConnectionPool(poolName, url, user, password, max); pools.put(poolName, pool); log("Initialized pool " poolName); } } }   一个枚举对象保存所有的属性名,如果属性名带有.url结尾,则表示是一个连接池对象需要被实例化。创建的连接池对象保存在一个Hashtable实例变量中。连接池名字作为索引,连接池对象作为值 下载本文示例代码


Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)Servlet中jdbc应用高级篇(四)
阅读(41) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~