您的位置:首页 > 数据库

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

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

例子: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();
  }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: