数据库连接池、反射和工厂模型

来源:互联网 发布:mac air键盘灯不亮 编辑:程序博客网 时间:2024/05/18 01:25
 

一,     由于创建连接的代价是很高的,我们每次访问数据库都要创建连接的话是非常西欧阿豪性的,我们可以在程序启动的时候先创建出一写连接,放到一个集合里,访问数据库的时候从集合中获取,使用结束再放回集合中。

例子:package cn.hbsi;

 

import java.io.InputStream;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

import java.util.LinkedList;

import java.util.Properties;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

 

public class MyDataSource {

 

      private LinkedList<Connection> pool = new LinkedList<Connection>();

 

      private String url;

      private String user;

      private String password;

      private String driver;

      private int initSize;

      private int maxSize;

      private int currentSize;

      private Lock lock = new ReentrantLock();

 

      /*

       * 服务器启动的时候, 创建MyDataSource, 在MyDataSource创建的时候, 初始化5个连接

       */

      public MyDataSource() {

           try {

                 Properties prop = new Properties();

                 InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("connConfig.properties");

                 prop.load(in);

                 url = prop.getProperty("url");

                 user = prop.getProperty("user");

                 password = prop.getProperty("password");

                 driver = prop.getProperty("driver");

                 initSize = Integer.parseInt(prop.getProperty("initSize"));

                 maxSize = Integer.parseInt(prop.getProperty("maxSize"));

                 Class.forName(driver);

                 for (int i = 0; i < initSize; i++)

                      createConnection();

           } catch (Exception e) {

                 throw new RuntimeException(e);

           }

      }

 

      public Connection getConnection() throws SQLException {

           try {

                 lock.lock();

                 if (pool.size() == 0 && currentSize < maxSize)

                      createConnection();

                 if (pool.size() > 0)

                      return pool.remove(); // 从list中删掉第一个元素, 将这个元素作为返回值返回

                 throw new SQLException("系统忙, 一会再来吧.");

           } finally {

                 lock.unlock();

           }

      }

 

      public void release(Connection conn) {

           pool.add(conn); // add是添加到最后一个

      }

 

      private void createConnection() throws SQLException {

           pool.add(DriverManager.getConnection(url, user, password));

           currentSize++;

      }

}

二,     反射

1主要是指程序可以访问、检测和修改其自身状态或行为的一种能力。

2.Java反射提供了以下功能:

a.           运行时判断任意一个对象所属的类;

b.          运行时构造任意一个类的对象;

c.          运行时判断任意一个类所具有的成员变量和方法。

d.          运行时调用任意一个对象的方法,通过反射甚至可以调用到 peivate的方法。

e.           生成动态代理。

3.

a.使用class类的getclass()方法得到class对象。

Myobject x=new myobject();

Class c1=x.getclass();

b.使用class类的forname()静态方法获得与字符串对应的class类对象。Class c2=class。Forname(“java.lang.Stirng”);

c.使用“类型名.class”获取该类型对应的class对象。

Class c1=Manager.Class;

Class c2=int.class;

Class c3=double[].class;

4.常用方法

Public String getName():获取此class对象所表示的权限定名;

Public field[] getField();获取此class对象所表示实体的所有public字段;

Public Field[] getDeclaredFields():获取此class对象所表示实体的所有字段;

Public Method[] getMethod():获取此class对象所表示实体的所有的public字段;

Public class[] getInterfaces():获取此class对象所有表示实体实现的所有接口class列表。

Public T newInstance():创建此class对象所表示类的一个新实例,使用的是不带参数的构造方法。

Public Method getMethod(String name,class<?>…parameterTypes):获取此class对象特定的方法,其中neme参数用于指定方法的名称;parameterTypes为可变参数,用于指定方法的数据类型

5.获取类类信息

a.获取指定类对应的class对象

Class clazz=Class.forName(“java.util.arrayList”);

b.获取指定类得包名

String packageName=clazz.getPackage().getName();

c获取指定类的修饰符

int mod=clazz.getModifiers();

String modifier=Modifier.toStrng(mod);

d获取指定类的完全限定名

String className=clazz.getName();

E获取指定了的父类

Class superClazz=clazz.getSuperclass();

F获取指定类实现的接口

Class[] interfaces=clazz.getinterfaces();

G获取指定类的成员变量

Field[] field=clazz.getDeclaredFields();

三.工厂模式

工厂方法
你会建立一个专门生产Sample实例的工厂:

public class Factory{

  public static Sample creator(int which){

  //getClass 产生Sample 一般可使用动态类装载装入类。
  if (which==1)
    return new SampleA();
  else if (which==2)
    return new SampleB();

  }

}

原创粉丝点击