1 采用数据库连接池,close资源非常昂贵2 close之后马上赋值为null,标志其可以被回收
解决方案 »
- poi在linux下可以对word表进行写操作吗,word表行列怎么控制?
- struts2中怎样将参数放入session范围内?
- spring tiles
- 请教 有关 EJB 从 客户端 调用的问题 not bound
- Weblogic上集群怎么解决附件的问题?
- java 找不到符号
- 莱鸟问题,我用jdbc连oracle,去oracle网站确发现一堆jdbc,每个版本的oracle都有自己的jdbc..
- 看看我们单位的面视题目
- 电商网站怎么实现下单后后台客服可以有提示
- proguard 之后报java.io.FileNotFoundException
- 父页面刷新问题(struts)
- EJB客户端如何显示数据记录???---晕死我了!!!
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Statement statement = null;
这几句话什么意思啊,都是空,下面还关什么连接啊
if (connection != null) {
connection.close();
}
中间加一条System.out.println()看看close执行没有
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;/**
* 用于操作Tomcat Mysql连接池的类
* <p>
*
* @version 1.0 2004-10-07
* @author squares
*/public class DataBaseMysqlPool { private static Context context; private static DataSource dataSource; private Connection connection; private PreparedStatement preparedStatement; private ResultSet resultSet; private Statement statement; /**
* Init Connection
* <p>
*/ static { try {
context = new InitialContext();
dataSource = (DataSource) context
.lookup("java:comp/env/jdbc/Mysql"); } catch (Exception e) {
} } /**
* Close Connect
* <p>
*
* @throws SQLException
*/ public void Close() { try { if (resultSet != null) {
resultSet.close();
resultSet = null;
}
if (statement != null) {
statement.close();
statement = null;
} if (preparedStatement != null) {
preparedStatement.close();
preparedStatement = null;
} if (connection != null) {
connection.close();
connection = null;
} } catch (SQLException e) {
System.out.println("1"+e.getMessage().toString());
} finally { if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
System.out.println("2"+e.getMessage().toString());
}
} if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
System.out.println("3"+e.getMessage().toString());
}
} if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
System.out.println("4"+e.getMessage().toString());
}
} if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
System.out.println("5"+e.getMessage().toString());
}
} } }这个里面没有报错,不过每次刷新多了以后struts的action倒是有抛出异常!2004-12-20 14:50:19 org.apache.struts.action.RequestProcessor processException
警告: Unhandled Exception thrown: class java.lang.NullPointerException
2004-12-20 14:50:19 org.apache.struts.action.RequestProcessor processException
警告: Unhandled Exception thrown: class java.sql.SQLException最后就是这种错误
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Statement statement = null;你的所有的对象都是新建的,且都指向NULL,后面的TRY CATCH 有用吗?
dataSource = (DataSource) context
.lookup("java:comp/env/jdbc/Mysql");
可是我现在改成这样 public void Close(ResultSet resultSet, PreparedStatement preparedStatement,
Connection connection) { try { if (resultSet != null) {
resultSet.close();
resultSet = null;
} if (preparedStatement != null) {
preparedStatement.close();
preparedStatement = null;
} if (connection != null) {
connection.close();
connection = null;
} } catch (SQLException e) {
} }吧连接都传进去了,关闭掉,应该没问题了吧,可是从MySql Administrator里面还是看到连接数不停的增长,状态都是sleep,哎,怎么办啊
我想请问一下:
"close之后马上赋值为null,标志其可以被回收"这句话,我有点疑问,如果不赋值为null的话,java的垃圾回收,就不会回收这个引用吗?
context = new InitialContext();
dataSource = (DataSource) context
.lookup("java:comp/env/jdbc/Mysql");我知道你的是tomcat的dbcp连接池,但是上面的语句没有创建连接..你是在哪儿创建连接的?另外你的观点有误,close我们通常所说的关闭,在dbcp中并非关闭了连接,而是把连接放回到连接池中,此时的连接是不关闭的....可以看看tomcat的dbcp文档...
另外,其实把resultset传递进来就可以了..resultset可以得到它的statement,statement 可以得到连接....都有方法..最后,把resultset作为参数传递其实也是有问题的...不过这个是一个普遍的问题...如果天涯的说法正确("close之后马上赋值为null,标志其可以被回收"),那么即使用参数传递resultset也不能保证内存的释放,因为java的参数传递,传递的是引用的副本,虽然你把当前的引用置为null了,可是原来的引用是没有被置为null的,这就要看java的垃圾回收是否会回收这样的引用,正因为如此我才会问 天涯那个问题,