数据库连接池、反射和工厂模型
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实例的工厂:
例子: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(); } } |
相关文章推荐
- 反射+工厂模型+Properties
- 数据库连接池、反射和工厂模型
- 企业库、抽象工厂、单例、反射、分层的简单的学习示例源码【转】
- 反射实现不同模型相同属性赋值
- .Net反射工厂设计模式
- 设计模式学习之简单工厂+反射+配置文件
- 接口,工厂及反射
- PBR Step by Step(四)Lambertian反射模型
- 反射机制和工厂设计模式结合使用
- 工厂模型学习心得(二)(ASP.Net)
- 反射技术与工厂方法 (using C#)
- unity shader (6)--实现高光反射光照模型
- PBRT阅读: 第九章 反射模型 第9.1-9.2节
- 策略模式+简单工厂+反射
- 反射技术与工厂方法
- 使用反射在.NET中实现动态工厂
- 三层架构之抽象工厂加反射----实现数据库转换
- 翻译 次世代基于物理渲染的反射模型
- 三层架构之抽象工厂加反射----实现数据库转换
- 14章类型信息--注册工厂---instandceof与Class的等价性--反射