读书人

关于JSP数据库连接池的有关问题-弄不

发布时间: 2011-11-06 07:07:53 作者: rapoo

关于JSP数据库连接池的问题-弄不出来真郁闷
在网上看到的一个例子,我想连ACCESS数据库,弄不出来,现把代码贴出来:
网站根目录下 ConnPool.jsp :
<%@ page contentType= "text/html; charset=GBK " %>
<%@ page import = "java.sql.* " %>
<jsp:useBean id= "connManager " scope= "page " class= "mybean.DBConnManager " />
<html>
<head>
<title>
购物商城首页
</title>
</head>
<body bgcolor= "#B0C4DE ">
<center> <h1> 欢迎访问本购物商城 </h1> </center>
<%
String accstr=request.getRealPath( "data/shopping.mdb "); //设置路径
connManager.setConnStr(accstr);
Connection connA=connManager.getConnection( "access ");
if (connA==null)
{
out.print( "数据库正忙,请稍后再访问 ");
}
Statement stmtA=connA.createStatement();
String sql= "select * from userinfo ";
ResultSet rs=stmtA.executeQuery(sql);
while (rs.next())
{
out.print( " <table border= '0 '> ");
out.print( " <tr> ");
out.print( " <td> "+rs.getString( "username ")+ " </td> ");
out.print( " <td> "+rs.getString( "userpass ")+ " </td> ");
out.print( " </tr> </table> ");
}
rs.close();
stmtA.close();
connManager.returnConnection( "access ",connA);
%>

</body>
</html>

网站根目录 WEB-INF\classes\ 下两个JAVA文件:
DBConnPool.java :

package mybean;
import java.util.*;
import java.sql.*;
public class DBConnPool {
private int using=0; //正在使用连接的数量
private Vector connections=new Vector(); //目前可用的连接数 private int maxconn=0; //最大连接数
private String poolname= " "; //连接池名
private String dbid= " "; //数据库标识
private String drivername= " "; //驱动程序名
private String username= " "; //数据库帐号
private String passwd= " "; //数据库密码

public DBConnPool(String poolname,String dbid,String drivername,
String username,String passwd,int maxconn){
this.poolname=poolname;
this.drivername=drivername;
this.dbid =dbid;
this.username =username;
this.passwd=passwd;
this.maxconn=maxconn;
}

/*将空闲连接返回给连接池*/
public synchronized void returnConnection(Connection conn){


connections.addElement(conn); //将指定连接加到向量末尾
using--; //连接用户减1
}

/*从连接池得到一个连接*/
public synchronized Connection getConnection(){
Connection conn = null; //Connection是一个类,
if (connections.size() > 0) {
conn = (Connection) connections.elementAt(0); //获取第一个连接
connections.removeElementAt(0);//获得一个连接,并将此连接从队列中删除.

try {
if (conn.isClosed()) //如果此连接已关闭,刚继续获取
conn = getConnection();
}
catch (Exception e) {
e.printStackTrace();
}
}
//如果实际使用的连接数小于最大连接数即有可用连接,就新增加一个连接
else if (maxconn == 0 || using < maxconn){
//如此时无可用连接(maxconn == 0)且连接数又未达到上限(using < maxconn)),就创建一个新连接
conn=newConnection();
}
//如果连接数已达到上限就返回空指针
if (conn!=null){
using++;
}
return conn;
}

/*创建新的连接*/
public Connection newConnection(){
Connection conn=null;
try{
Class.forName(drivername); //加载驱动
conn=DriverManager.getConnection(dbid,username,passwd);
}catch(Exception e){
e.printStackTrace();
return null;
}
return conn;
}

/*关闭所有连接*/
public synchronized void closeConn(){
Enumeration allConnections=connections.elements();
while (allConnections.hasMoreElements()){
Connection conn=(Connection) allConnections.nextElement();
try{
conn.close();
}catch(SQLException e){


e.printStackTrace();
}
}
connections.removeAllElements();
}
}

DBConnManager.java :

package mybean;
import java.sql.*;
import java.util.*;
import mybean.DBConnPool;

public class DBConnManager {
Vector poolnames =new Vector(); //连接池名列表
Vector drivernames=new Vector(); //驱动程序名列表
Vector dbids=new Vector(); //数据库标识列表
Vector usernames=new Vector(); //用户名列表
Vector passwds=new Vector(); //用户密码列表
Vector maxconns=new Vector(); //最大连接数列表
Hashtable connPools=new Hashtable(); //连接池队列
StringBuffer AConnStr =new StringBuffer( "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ= ");

public void setConnStr(String s) //用于在JSP页中设ACCESS数据库文件路径
{
AConnStr.append(s);
}

public DBConnManager() {
poolnames.addElement( "access "); //添加Access数据库的连接信息
drivernames.addElement( "sun.jdbc.odbc.JdbcOdbcDriver ");
dbids.addElement(AConnStr.toString());
usernames.addElement( " ");
passwds.addElement( " ");
maxconns.addElement( "5 ");

poolnames.addElement( "sqlserver2000 ");//添加SQL Server数据库的连接信息
drivernames.addElement( "com.microsoft.jdbc.sqlserver.SQLServerDriver ");
dbids.addElement( "jdbc:microsoft:sqlserver://localhost:1433;DatabserName=shopping ");
usernames.addElement( " ");
passwds.addElement( " ");
maxconns.addElement( "5 ");

poolnames.addElement( "mysql "); //连接Mysql数据库信息
drivernames.addElement( "org.gjt.mm.mysql.Driver ");
dbids.addElement( "jdbc:mysql://localhost/shopping ");
usernames.addElement( " ");
passwds.addElement( " ");
maxconns.addElement( "5 ");

poolnames.addElement( "oracle "); //连接Oracle8i/9i数据库
drivernames.addElement( "oracle.jdbc.driver.OracleDriver ");


dbids.addElement( "jdbc:oracle:thin:@localhost:1521:shopping ");
usernames.addElement( " ");
passwds.addElement( " ");
maxconns.addElement( "5 ");

createPools(); //创建连接池
}

/*创建连接池*/
private void createPools(){
for (int i=0;i <poolnames.size();i++)
{
String poolname=poolnames.elementAt(i).toString();
String drivername=drivernames.elementAt(i).toString();
String dbid=dbids.elementAt(i).toString();
String username=usernames.elementAt(i).toString();
String passwd=passwds.elementAt(i).toString();
int maxconn=0;
try{
maxconn=Integer.parseInt(maxconns.elementAt(i).toString());
}catch (NumberFormatException e){
e.printStackTrace();
}
DBConnPool pool=new DBConnPool(poolname,drivername,dbid,username,
passwd,maxconn);
connPools.put(poolname,pool);
}
}

/*得到一个指定连接池中的连接*/
public Connection getConnection(String name){
DBConnPool pool=(DBConnPool) connPools.get(name);
if (pool!=null)
{
return pool.getConnection();
}
return null;
}

/*将连接返回给由指定的连接池*/
public void returnConnection(String name,Connection conn){
DBConnPool pool=(DBConnPool) connPools.get(name);
if (pool!=null)
{
pool.returnConnection(conn);
}
}

/*关闭所有连接*/
public synchronized void closeConns(){
Enumeration allPools=connPools.elements();
while (allPools.hasMoreElements()){
DBConnPool pool=(DBConnPool) allPools.nextElement();
pool.closeConn();
}
}

}

我的ACCESS数据库为网站根目录下data\shopping.mdb



编译好之后,运行提示错误:java.lang.NullPointerException.........


[解决办法]
第一,别急
第二,做实验可以选一个简洁一点的例子

[解决办法]
还有空指针异常,汗!建议你多看看别人的连接代码!
都是一个道理的
[解决办法]
rg.apache.jsp.ConnPool_jsp._jspService(ConnPool_jsp.java:72)
这里错了,到你的WEB服务器下的缓存中找到ConnPool_jsp.java这个文件的72行看看
[解决办法]
我也遇到了:

现在还没解决!
[解决办法]
这个东西很麻烦,把人搞得要人命~~~ 楼主你还是慢慢等待吧,关注中!
[解决办法]
ACCESS这种文件型数据库能用连接池吗?
[解决办法]
ACCESS不支持多用户并发连接,所以连接池对它来说根本没用。
[解决办法]
找例程还是因简入繁,就象挑选英文阅读文章的原则是不认识的单词不能超过50%.
[解决办法]
learnning
[解决办法]
关注一下。。。
[解决办法]
不一定就是你的连接池出现问题,
首先看一下tomcat的log 包括启动日值都仔细看一遍。
日志是分析异常的最好方法,没有日志的话只能debug了

你那一点异常根本不能代表什么。肯定由其他原因导致你的tomcat 内部异常

[解决办法]
数据库用MYSQL吧!

读书人网 >Java Web开发

热点推荐