public static Object getInnter(Object con){
Object re=null;
Field f;
try {
f = congetClass()getDeclaredField(inner)
fsetAccessible(true)
re= fget(con) //取得内部包装的Connection
fsetAccessible(false)
} catch Exception e) {
}
return re;
}
以上代码运行后输出
con Class Type is:commchangevcpimplNewProxyConnection
Inner con Class Type is:commysqljdbcJDBCConnection
Data from DB:
o and o is same object
Data from DB:
上述代码中首先从数据库连接池获得一个连接发现连接类型并不是mysql的数据库连接而是commchangevcpimplNewProxyConnection根据类名中可以推测从数据库连接池中获得的连接只是一个代理接着通过反射取得这个对象中名为inner的属性并打印其Class类型发现这才是真正的mysql连接关闭NewProxyConnection连接再向池中请求一个新的连接同样获取该连接内部的实际数据库连接对象发现第一次使用的实际数据库连接对象o和第二次使用的对象o是完全相同的
这说明前后两次数据库连接的请求均返回了相同的数据库连接关闭NewProxyConnection连接时并没有真正关闭数据库连接而只是将数据库连接放入连接池保存使得数据库连接在连接池中得到了复用而从连接池返回的NewProxyConnection对象只是对真实数据库连接的包装
除了线程池和数据库连接池对于普通的Java对象在必要的时候也可以进行池化管理对于那些经常使用并且创建很费时的大型对象来说使用对象池维护不仅可以节省获得对象实例的成本还可以减轻GC频繁回收这些对象产生的系统压力但对于生成对象开销很小的对象进行池化反而可能得不偿失维护对象池的成本可能会大于对象池带来的好处
注意在JDK中new操作的效率是相当高的不需要担心频繁的new操作对系统有性能影响但是new操作时所调用的类构造函数可能是非常费时的对于这些对象可以考虑池化
返回目录Java程序性能优化让你的Java程序更快更稳定
编辑推荐
Java程序设计培训视频教程
JEE高级框架实战培训视频教程
JME移动开发实战教学视频
Visual C++音频/视频技术开发与实战
Oracle索引技术
ORACLEG数据库开发优化指南
[] []