当前位置: 技术问答>java相关
关于连接池释放问题.........?
来源: 互联网 发布时间:2017-03-31
本文导语: CDbUtil.java (设置连接池及一些执行SQL语句操作) ............ 以连接池方式打开库 public Connection getConnection() throws Exception { try{ //根据运行方式决定获取Connection的...
CDbUtil.java (设置连接池及一些执行SQL语句操作)
............
以连接池方式打开库
public Connection getConnection() throws Exception {
try{
//根据运行方式决定获取Connection的方法
if (this.byJsp) { //通过jsp运行的话,从ConnectionPool获得
this.printWarn("现在按默认JSP方式运行!");
if (ds==null) {
Context context = new InitialContext();
ds = (DataSource)context.lookup("java:/CapPool");
}
if (connection==null) connection = ds.getConnection() ;
}
else { //直接运行的
this.printWarn("现在按直接方式运行!");
if (connection==null) {
Class.forName(this.SQLDriver);
connection = DriverManager.getConnection(this.SQLURL);
}
}
this.print("getConnection is ok!");
}catch(Exception e){
this.setLastError(e.getMessage());
this.printError();
throw e;
}
return connection;
}
.............
-----------------------------------------------
CPublic.java ( 放一些通用的数据库存操作)
.............
调用 CDbUtil里的连接数据库
public CPublic() {
dbUtil = new CDbUtil();
try{
dbUtil.getConnection() ;
}
catch(Exception e)
{
e.printStackTrace() ;
}
}
。。。。。。。。。
调用 CDbUtil里的关闭数据库
public void closeConnection() throws CZyException{
try {
dbUtil.closeConnection();
}
catch (Exception e) {
throw new CZyException("关闭数据库连接失败");
}
}
public static String valueOf(String value,String defaultValue) {
if (value==null) return defaultValue;
else return value;
}
...............
------------------------------------
存在问题:连接池不能自动释放,如jsp程序调用cpublic时,需用cpublic里的closeConnection()来关闭连接
是不是程序在设计过程中出现了什么问题?
............
以连接池方式打开库
public Connection getConnection() throws Exception {
try{
//根据运行方式决定获取Connection的方法
if (this.byJsp) { //通过jsp运行的话,从ConnectionPool获得
this.printWarn("现在按默认JSP方式运行!");
if (ds==null) {
Context context = new InitialContext();
ds = (DataSource)context.lookup("java:/CapPool");
}
if (connection==null) connection = ds.getConnection() ;
}
else { //直接运行的
this.printWarn("现在按直接方式运行!");
if (connection==null) {
Class.forName(this.SQLDriver);
connection = DriverManager.getConnection(this.SQLURL);
}
}
this.print("getConnection is ok!");
}catch(Exception e){
this.setLastError(e.getMessage());
this.printError();
throw e;
}
return connection;
}
.............
-----------------------------------------------
CPublic.java ( 放一些通用的数据库存操作)
.............
调用 CDbUtil里的连接数据库
public CPublic() {
dbUtil = new CDbUtil();
try{
dbUtil.getConnection() ;
}
catch(Exception e)
{
e.printStackTrace() ;
}
}
。。。。。。。。。
调用 CDbUtil里的关闭数据库
public void closeConnection() throws CZyException{
try {
dbUtil.closeConnection();
}
catch (Exception e) {
throw new CZyException("关闭数据库连接失败");
}
}
public static String valueOf(String value,String defaultValue) {
if (value==null) return defaultValue;
else return value;
}
...............
------------------------------------
存在问题:连接池不能自动释放,如jsp程序调用cpublic时,需用cpublic里的closeConnection()来关闭连接
是不是程序在设计过程中出现了什么问题?
|
当然,只有关闭连接才能释放
|
采用Wrap的设计模式将Connection包装一层,覆盖finalize方法在这个方法里面实现Connection close/release的方法。这样由JVM可以帮你回收,这只是一个防范的方法, 最好还是在程序中显式的关闭。
|
还是手动释放连接的好。
依靠容器来自动的话(假设容器已经可以判断出这个连接已经无效)其实也并不是你用完这个以后马上就可以确认的
依靠容器来自动的话(假设容器已经可以判断出这个连接已经无效)其实也并不是你用完这个以后马上就可以确认的
|
http://www-900.ibm.com/developerWorks/cn/java/l-connpoolproxy/index.shtml