您现在的位置是:首页 >

oracle数据库连接数设置 Oracle数据库 关于连接池一

火烧 2021-10-08 12:04:11 1088
Oracle数据库 关于连接池一   到目前为目 JDBC 的连结池只是一个接口 没有真正的实现 JDBC 正在开发中 据报已经支持连结池 但JDBC 用了JNDI技术 连结池的配置可以让一个高手都烦

Oracle数据库 关于连接池一  

oracle数据库连接数设置 Oracle数据库 关于连接池一
  到目前为目 JDBC 的连结池只是一个接口 没有真正的实现 JDBC 正在开发中 据报已经支持连结池 但JDBC 用了JNDI技术 连结池的配置可以让一个高手都烦死     目前第三方已经实现的连结池当然是poolman 版对一般用户来说已经足够用了 配置也简单 版虽然增加了一些功能 但配置也是采用JNDI 对RMI和EJB不懂的朋友可能很烦 建议用 的了     如果有兴趣 自己也可以实现连结池 最关键的技术也就是把连结作为参数传给一个BEAN 用完后返回这个参数连结而不是关闭     下面是一个简单的实现:    DBConnectionManager java程序清单如下      import java io *;   import java sql *;   import java util *;   import java util Date;      /**   * 管理类DBConnectionManager支持对一个或多个由属性文件定义的数据库连接   * 池的访问 客户程序可以调用getInstance()方法访问本类的唯一实例    */   public class DBConnectionManager {   static private DBConnectionManager instance; // 唯一实例   static private int clients;      private Vector drivers = new Vector();   private PrintWriter log;   private Hashtable pools = new Hashtable();      /**   * 返回唯一实例 如果是第一次调用此方法 则创建实例   *   * @return DBConnectionManager 唯一实例   */   static synchronized public DBConnectionManager getInstance() {   if (instance == null) {   instance = new DBConnectionManager();   }   clients++;   return instance;   }      /**   * 建构函数私有以防止其它对象创建本类实例   */   private DBConnectionManager() {   init();   }      /**   * 将连接对象返回给由名字指定的连接池   *   * @param name 在属性文件中定义的连接池名字   * @param con 连接对象\r     */   public void freeConnection(String name Connection con) {   DBConnectionPool pool = (DBConnectionPool) pools get(name);   if (pool != null) {   pool freeConnection(con);   }   }      /**   * 获得一个可用的(空闲的)连接 如果没有可用连接 且已有连接数小于最大连接数   * 限制 则创建并返回新连接   *   * @param name 在属性文件中定义的连接池名字   * @return Connection 可用连接或null   */   public Connection getConnection(String name) {   DBConnectionPool pool = (DBConnectionPool) pools get(name);   if (pool != null) {   return pool getConnection();   }   return null;   }      /**   * 获得一个可用连接 若没有可用连接 且已有连接数小于最大连接数限制    * 则创建并返回新连接 否则 在指定的时间内等待其它线程释放连接    *   * @param name 连接池名字   * @param time 以毫秒计的等待时间\r     * @return Connection 可用连接或null   */   public Connection getConnection(String name long time) {   DBConnectionPool pool = (DBConnectionPool) pools get(name);   if (pool != null) {   return pool getConnection(time);   }   return null;   }      /**   * 关闭所有连接 撤销驱动程序的注册\r     */   public synchronized void release() {   // 等待直到最后一个客户程序调用   if ( clients != ) {   return;   }      Enumeration allPools = pools elements();   while (allPools hasMoreElements()) {   DBConnectionPool pool = (DBConnectionPool) allPools nextElement();   pool release();   }   Enumeration allDrivers = drivers elements();   while (allDrivers hasMoreElements()) {   Driver driver = (Driver) allDrivers nextElement();   try {   DriverManager deregisterDriver(driver);   log( 撤销JDBC驱动程序 + driver getClass() getName()+ 的注册\ );   }   catch (SQLException e) {   log(e 无法撤销下列JDBC驱动程序的注册: + driver getClass() getName());   }   }   }      /**   * 根据指定属性创建连接池实例    *   * @param props 连接池属性   */   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( name lastIndexOf( ));   String url = props getProperty(poolName + url );   if (url == null) {   log( 没有为连接池 + poolName + 指定URL );   continue;   }   String user = props getProperty(poolName + user );   String password = props getProperty(poolName + password );   String maxconn = props getProperty(poolName + maxconn );   int max;   try {   max = Integer valueOf(maxconn) intValue();   }   catch (NumberFormatException e) {   log( 错误的最大连接数限制: + maxconn + 连接池: + poolName);   max = ;   }   DBConnectionPool pool =   new DBConnectionPool(poolName url user password max);   pools put(poolName pool);   log( 成功创建连接池 + poolName);   }   }   }      /**   * 读取属性完成初始化   */   private void init() {   InputStream is = getClass() getResourceAsStream( /db properties );   Properties dbProps = new Properties();   try {   dbProps load(is);   }   catch (Exception e) {   System err println( 不能读取属性文件 +   请确保db properties在CLASSPATH指定的路径中 );   return;   }   String logFile = dbProps getProperty( logfile DBConnectionManager log );   try {   log = new PrintWriter(new FileWriter(logFile true) true);   }   catch (IOException e) {   System err println( 无法打开日志文件: + logFile);   log = new PrintWriter(System err);   }   loadDrivers(dbProps);   createPools(dbProps);   }      /**   * 装载和注册所有JDBC驱动程序\r     *   * @param props 属性   */   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( 成功注册JDBC驱动程序\ + driverClassName);   }   catch (Exception e) {   log( 无法注册JDBC驱动程序: +   driverClassName + 错误: + e);   }   }   }      /**   * 将文本信息写入日志文件   */   private void log(String msg) {   log println(new Date() + : + msg);   }      /**   * 将文本信息与异常写入日志文件   */   private void log(Throwable e String msg) {   log println(new Date() + : + msg);   e printStackTrace(log);   }      /**   * 此内部类定义了一个连接池 它能够根据要求创建新连接 直到预定的最\r lishixinzhi/Article/program/Oracle/201311/17331  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码