大家好,我的webapp在运行时会不定期的遭遇"http 500"的错误信息,报告NullPointer异常,详细情况如下

0. 我采用jdk1.5.0, struts1.2.8开发,数据库为MySQL, 容器为Tomcat5.5.10。数据库连接采用tomcat的连接池,配置在web应用的/META-INF/context.xml里

1. 在开发期间,我碰到过NullPointer异常,它来自于访问数据库,试图从某个表中获得ResultSet的语句。经过检查,我发现是在访问后忘记调用conn.close(),经过改正后,经过测试,再也没有遇到NullPointer的问题。

2. 我将应用部署到客户的服务器上。这台服务器性能一般,512M的内存,上面还跑着oracle作服务。我将jdk, MySQL和tomcat安装,一开始一切运行良好。试运行开始。

3. 在试运行开始后的72个小时内,客户便遇到了两次的NullPointer异常报告。错误信息显示,均是来自访问数据库表,试图获取ResultSet时抛出的。当NullPointer抛出后,web应用无法使用,即任何试图连接数据库的操作都会抛出相同的NullPointer异常,无论访问哪个表。

4. 由于业务代码经过测试,我相信没有问题,因此,我判断问题在于当NullPointer异常抛出后,web应用无法从tomcat的连接池中获取连接。我又查阅了tomcat的文档,发现应该在/META-INF/context.xml中的标记内添加属性,防止连接池泄漏。

====== /META-INF/context.xml ====

========================================

即添加了

removeAbandoned="true"removeAbandonedTimeout="60"logAbandoned="true"

5. 为了验证我的判断,我编写了一个简单的测试。首先,我写了一个servlet叫做dbtest, 访问数据库中的某个表,获取全部的数据。其次,我用apache jemter作压力测试,设置100个线程并发访问,连续运行。经过6个小时的测试,tomcat和我的webapp运行良好,没有遇到NullPointer问题。但这不能肯定我之前的判断,因此,我对最初的配置进行同样的测试,即/META-INF/contex.xml中去掉[removeAbandoned="true"

removeAbandonedTimeout="60"

logAbandoned="true"]属性。

6. 问题来了:测试同样运行的良好,没有遇到NullPointer异常!这就是说,我的判断不是正确的,客户仍会遇到NullPointer的异常报告。

请板桥大哥,请各位达人指教,问题出在哪里呢?我该从什么地方入手解决这个问题呢?

另外,我怀疑是否是由于客户的服务器负载太大索引起,所以将/WEB-INF/context.xml中的最大活跃连接数改为50,即

maxActive="50"

目前客户仍在试运行,我相信他们不久之后还会遇到NullPointer...

7. 其他的信息

这个应用比较简单,业务流程不算复杂,系统同时在线大约在50-70人。我自己写了一个简单(丑陋:)的CommonDAO用以提供基本的db访问。然后每张表/视图的访问对应一个DAO,它继承自CommonDAO。CommonDAO代码如下:

import ... // import stuffpublic class CommonDAO {

static Logger log = Logger.getLogger(CommonDAO.class.getName());// jndi namestatic final String jndi ="jdbc/ArmyDB";

private DataSource ds = null;

private Connection conn = null;

protected void init() {// use container datasourcetry {

Context initCtx = new InitialContext();

Context envCtx = (Context) initCtx.lookup("java:comp/env");

this.ds = (DataSource) envCtx.lookup(jndi);

this.conn = ds.getConnection();

} catch (NamingException ne) {

log.debug(ne);

} catch (SQLException sqle) {

log.debug(sqle);

}

}

public CommonDAO() {

init();

}

public Connection getConnection() {

return this.conn;

}

protected void checkConn() throws SQLException {

if (this.conn == null || this.conn.isClosed()) {

init();

}

}

public PreparedStatement getPreparedStatement(String sql) {

PreparedStatement pstmt = null;

if (this.conn != null) {

try {

checkConn();

pstmt = conn.prepareStatement(sql);

} catch (SQLException e) {

log.info(e);

}

} else {// this seems will not happened...log.debug("null");

}

return pstmt;

}// for query, selectpublic ResultSet executeQueryPSTMT(PreparedStatement pstmt) {

ResultSet rs = null;

try{

checkConn();

rs = pstmt.executeQuery();

} catch(SQLException sqle) {

log.info(sqle);

}

return rs;

}// for insert, update, delete, DDLs..public int executeUpdatePSTMT(PreparedStatement pstmt) {

int rowsAffected = -1;

try{

checkConn();

rowsAffected = pstmt.executeUpdate();

} catch(SQLException sqle) {

log.info(sqle);

}

return rowsAffected;

}// select [fields...] from [tablename] where [conditions...]public ResultSet executeQuery(String sql){

ResultSet rs = null;

try{

checkConn();

Statement stmt = this.conn.createStatement();

rs = stmt.executeQuery(sql);

} catch(SQLException sqle){

log.info(sqle);

}

return rs;

}

public int executeUpdate(String sql) {

int rowsAffected = -1;

try {

checkConn();

Statement stmt = this.conn.createStatement();

rowsAffected = stmt.executeUpdate(sql);

} catch (SQLException sqle) {

log.info(sqle);

}

return rowsAffected;

}// insert: insert into [tablename][(col1, col2, ...)] values(v1, v2, ...)public int executeInsert(String sql) {

return this.executeUpdate(sql);

}// delete: delete from [tablename] where[condition]public int executeDelete(String sql) {

return this.executeUpdate(sql);

}// create, drop, alter...public int executeDDL(String sql) {

return this.executeUpdate(sql);

}

public void destory() {

if (conn != null) {

try {//conn.commit();conn.close();

conn = null;

} catch (SQLException sqle) {

log.debug(sqle);

}

}

}

public List getAllTableNames() {

List list = new ArrayList();

try {

checkConn();

DatabaseMetaData dbmd = conn.getMetaData();

String[] types = {"TABLE"};

ResultSet rs = dbmd.getTables(null, null,"%", types);

while (rs.next()) {

String tableName = rs.getString(3);

list.add(tableName);

}

} catch (SQLException e) {// TODO: handle exceptionlog.info(e);

}

return list;

}

public boolean supportsBatchUpdates() {

boolean bool = false;

try {

checkConn();

DatabaseMetaData dmd = conn.getMetaData();

if (dmd.supportsBatchUpdates()) {

bool = true;

}

} catch (SQLException e) {// TODO: handle exception}

return bool;

}

protected void close(ResultSet rs) {

if (rs != null) {

try {

rs.close();

} catch (SQLException e) {

}

rs = null;

}

}

protected void close(PreparedStatement pstmt) {

if (pstmt != null) {

try {

pstmt.close();

} catch (SQLException e) {

}

pstmt = null;

}

}

protected void close(Connection conn) {

if (conn != null) {

try {

conn.close();

} catch (SQLException e) {

e.printStackTrace();

}

conn = null;

}

}

protected void rollback(Connection conn) {

if (conn != null) {

try {

conn.rollback();

} catch (SQLException e) {

e.printStackTrace();

}

conn = null;

}

}

}

如果访问user表,则编写UserDAO类,继承自CommonDAO,提供CRUD方法

请大家指点!谢谢了

mysql nullpoint_访问数据库时遇到NullPointer Exception相关推荐

  1. MySQL服务器地址为空,C++/MySQL - 通过主机地址访问数据库时'未知的MySQL服务器主机';没有IP...

    我有一个数据库设置在我的1and1包中,我想在C++应用程序中连接到它.它在PHP中工作得很好.C++/MySQL - 通过主机地址访问数据库时'未知的MySQL服务器主机';没有IP 的问题是,我没 ...

  2. 访问数据库时如何解决并发问题

    解决并发主要是用到了锁和事务. 锁  :给记录或表加上锁是为了对当前操作对象加上一个状态表示位,          让其他用户在获取编辑权限时有了判断. 事务:是为了确保一组操作的完整性.(要么就全部 ...

  3. 用Windows身份验证访问数据库时,出现“用户 'YSBY-PC\ASPNET' 登录失败。”,这YSBY是我的计算机名。...

    用Windows身份验证访问数据库时,出现"用户 'YSBY-PC\ASPNET' 登录失败.",这YSBY是我的计算机名. 下面是我的搜集的解决办法,期望能对大家有所帮助. 第一 ...

  4. 数据库连接10060_通过mysql 连接远程数据库时,输入密码后,提示10060错误

    能提示输入密码,说明网络能够连接,而且能连到服务器.输入密码后提示错误,说明应该是权限问题 解决方法: ​一.进入mysql数据库命令行 ​二.输入use mysql; ​三.设置root账号密码为1 ...

  5. 安mysql一直转圈_在访问数据库时没报错一直转圈,mysql版本不同的连接方式

    如url访问获取数据库信息,一直转圈.一般为数据库无法连接.需要检查数据库连接信息 mysql5.0以下的连接方式: db.properties jdbc.driver=com.mysql.jdbc. ...

  6. IDEA访问数据库时,某一个字段数据库中有值但是访问到的数据始终是null

    问题描述 Request请求之后,页面返回了数据,其他字段都对,就那一个字段是null 排除问题 能访问到其他数据,说明IDEA连接数据库时成功了的,那不是数据库的问题就是字段本身的问题 存在的问题 ...

  7. IDEA访问数据库时,其中一个字段数据库中有值,但是访问到的数据的时候其中一个始终是null

    出现的问题描述 在请求数据库数据的时候,页面返回了数据,其他字段都对,其中有一个字段返回的结果为null,如图所示 排除问题 能访问到其他数据,说明IDEA连接数据库时成功了的,那不是数据库的问题就是 ...

  8. java.jsp.jdbc_Java-jsp使用JDBC访问数据库时显示乱码是怎么回事?

    1.JSP页面编码你改成utf-8; 2.servlet容器的编码格式你改成utf-8; 以tomcat为例:找到你的安装目录tomcat下面 > conf > server.xml用记事 ...

  9. IDEA 中 使用 MyBatis 访问数据库时 报错 Table ‘xxx.t_xxx‘ doesn‘t exist

    报错 与 xml 文件如下: 解决方法 在 xml 文件中修改 SQL 语句,在要查询的表前面加上 数据库名称. 也就是: <?xml version="1.0" encod ...

最新文章

  1. 数据中心防雷SPD技术漫谈
  2. matlab绘制圆,且求解两个圆的交点坐标
  3. 关于GIT的SSH加密问题
  4. r语言和metawin_如何创建R的HelloWorld包(Windows或Linux环境下)
  5. Bootstrap-Table入门篇
  6. Swift之深入解析如何将代码添加为自定义LLDB命令
  7. java option请求_java – 如何说服spring 4.2将OPTIONS请求传递给控制器
  8. SAP MM/FI 自动过账实现 OBYC 接口执行
  9. beeshell —— 开源的 React Native 组件库
  10. (190)FPGA变量初始化方法initial
  11. Scikit-Learn简单操作
  12. [Step By Step]SAP HANA PAL多元线性回归预测分析Linear Regression实例FORECASTWITHLR(预测)...
  13. DEV-c++中sort的用法
  14. Go语言核心之美 3.5-JSON
  15. 高效能人士的七个习惯读后感与总结概括-(第五章)
  16. 二 docker安装ca证书
  17. 一位基金经理的投资减法:少看研报多读书,少搞勾兑多数数;少跑调研多呼噜,少开晨会多开悟
  18. Nginx反向正向代理
  19. 淘宝店铺订单同步及获取解决方案
  20. nrf52840烧录提示错误原因和解决办法

热门文章

  1. [转]我的MYSQL学习心得(六) 函数
  2. ZJOI 2017 仙人掌
  3. 港科夜闻|香港科技大学许彬教授领导的国际研究团队揭示向弱势群体倾斜的疫苗分配策略最能令社会受益...
  4. Win7系统Microsoft Office Word已停止工作完美解决
  5. ios7查询摄像头使用权限
  6. 人脸识别-3D:Learning from Millions of 3D Scans for Large-scale 3D Face Recognition
  7. 对数几率回归原理和代码实现--机器学习
  8. CSDN 联合 18 家大厂招聘直播,10 小时突破百万热度
  9. 聚类分析法-层次聚类
  10. html中链接颜色怎么不一样,css如何设置不同的超链接颜色