遇到几个javabean小问题,但是在网络上搜索 了很久,没有得出答案,只好发贴求助。大伙指点啊。(200分)

  • 主题发起人 主题发起人 serial0
  • 开始时间 开始时间
S

serial0

Unregistered / Unconfirmed
GUEST, unregistred user!
遇到几个javabean小问题,但是在网络上搜索 了很久,没有得出答案,只好发贴求助。大伙指点啊。
我用jsp+javabean开发一个小网站。tomcat+ODBC(ACCESS),采用连接池。
问题1:javabean如何访问保存在会话中的对象?
为了有效使用数据池的连接,我设想用户成功登录后,就把获得的连接保存在会话中。用户在后续操作中,都使用这一个连接。等用户退出后,才释放此连接。这样一个用户,从头到尾只要用一个连接,应该是比较省的。
但是,我找了很久,也没有找到一段代码介绍如何在javabean中可以使用保存在会话session中的连接对象。大伙给个范例吧,哪怕是关键的几句啊。
问题2:jsp中定义javabean时使用的scope范围中“page”具体指什么?
  page,一般介绍中指页面。这好象很简洁明了,但我在写程序却发现好象有点不对劲,不知道我的理解错在哪里。比如,有一个jsp页 listfile.jsp?a=2&b=3,那么listfile.jsp、listfile.jsp?a=2&b=3、 listfile.jsp?a=8&b=9,这三个url是否都算同一个page范围,还是算三个page?
问题3:javabean中用destroy()释放的连接,什么时候生效?
  我试验着在javabean的init()中获取数据库连接池,在其他方法中使用,最后在destroy()中释放数据库连接池。但实际试用中,连接池很快就被用光了(我最大只定义10个,方便实验),destroy()没起作用啊。网络有的资料说destroy()只是告诉垃圾回收机制,至于何时使用由JVM自行决定,是这样?如何能让他马上释放连接呢?
 
package mybean;
import java.sql.*;
import java.util.*;
public class DBConnPool {
//正在使用连接的数量
private int using;
//目前可用的连接数,即空闲连接
private Vector connections=new Vector();
//最大连接数
private int maxconn;
//连接池名
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--;
}
/*从连接池得到一个连接*/
public synchronized Connection getConnection(){
Connection conn = null;
//Connection是一个类,
//connections是一个向量,用于存储连接对象,它所存储是的所有空闲状态的可用连接
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();
}
}


package mybean;
import java.sql.*;
import java.util.*;
public class DBConnManager {
//连接池名列表
private Vector poolnames =new Vector();
//驱动程序名列表
private Vector drivernames=new Vector();
//数据库标识列表
private Vector dbids=new Vector();
//用户名列表
private Vector usernames=new Vector();
//用户密码列表
private Vector passwds=new Vector();
//最大连接数列表
private Vector maxconns=new Vector();
//连接池队列
private Hashtable connPools=new Hashtable();
public DBConnManager() {
//添加Access数据库的连接信息
poolnames.addElement(&quot;access&quot;);
drivernames.addElement(&quot;sun.jdbc.odbc.JdbcOdbcDriver&quot;);
dbids.addElement(&quot;jdbc:odbc:shopping&quot;);
usernames.addElement(&quot;&quot;);
passwds.addElement(&quot;&quot;);
maxconns.addElement(&quot;5&quot;);
//添加SQL Server2000数据库的连接信息
poolnames.addElement(&quot;sqlserver2000&quot;);
drivernames.addElement(&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;);
dbids.addElement(&quot;jdbc:microsoft:sqlserver://localhost:1433;DatabserName=shopping&quot;);
usernames.addElement(&quot;&quot;);
passwds.addElement(&quot;&quot;);
maxconns.addElement(&quot;5&quot;);
//连接Mysql数据库信息
poolnames.addElement(&quot;mysql&quot;);
drivernames.addElement(&quot;org.gjt.mm.mysql.Driver&quot;);
dbids.addElement(&quot;jdbc:mysql://localhost/shopping&quot;);
usernames.addElement(&quot;&quot;);
passwds.addElement(&quot;&quot;);
maxconns.addElement(&quot;5&quot;);
//连接Oracle8i/9i数据库
poolnames.addElement(&quot;oracle&quot;);
drivernames.addElement(&quot;oracle.jdbc.driver.OracleDriver&quot;);
dbids.addElement(&quot;jdbc:oracle:thin:@localhost:1521:shopping&quot;);
usernames.addElement(&quot;&quot;);
passwds.addElement(&quot;&quot;);
maxconns.addElement(&quot;5&quot;);

//创建连接池
createPools();
}
/*将连接返回给由指定的连接池*/
public void returnConnection(String name,Connection conn){
DBConnPool pool=(DBConnPool) connPools.get(name);
if (pool!=null)
{
pool.returnConnection(conn);
}
}
/*得到一个指定连接池中的连接*/
public Connection getConnection(String name){
DBConnPool pool=(DBConnPool) connPools.get(name);
if (pool!=null)
{
return pool.getConnection();
}
return null;
}
/*关闭所有连接*/
public synchronized void closeConns(){
Enumeration allPools=connPools.elements();
while (allPools.hasMoreElements()){
DBConnPool pool=(DBConnPool) allPools.nextElement();
pool.closeConn();
}
}
/*创建连接池*/
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);
}
}
}

下面这个是主页面.JSP文件
<%@ page contentType=&quot;text/html;
charset=GBK&quot;
%>
<%@ page import =&quot;java.sql.*&quot;
%>
<jsp:useBean id=&quot;connManager&quot;
scope=&quot;application&quot;
class=&quot;mybean.DBConnManager&quot;
/>
<html>
<head>
<title>
购物商城首页
</title>
</head>
<body bgcolor=&quot;#B0C4DE&quot;>
<center><h1>欢迎访问本购物商城</h1></center>
<%
//Connection connA=connManager.getConnection(&quot;access&quot;);
Connection connS=connManager.getConnection(&quot;sqlserver2000&quot;);
if (connS==null)
{
%>
数据库正忙,请稍后再访问
<%
}
//Statement stmtA=connA.createStatement();
Statement stmtS=connS.createStatement();
%>
<%
String sql=&quot;select * from userinfo&quot;;
ResultSet rs=stmtS.executeQuery(sql);
while (rs.next())
{
%>
<tr>
<td><%=rs.getString(&quot;username&quot;)%></td>
<td><%=rs.getString(&quot;userpass&quot;)%></td>
</tr>
<%
}
rs.close();
stmtS.close();
connManager.returnConnection(&quot;sqlserver2000&quot;,connS);
%>
</body>
</html>
 
第2个问题,应该算3个页面。
 
大唐电信,你贴的什么
 
数据库的连接池啊,前两个是相关的类,后面的是jsp调用。
 
连接池,没用过,我数据库只用javabean连接,连接池啥好处
 
如果web页面频繁的与数据库建立连接Connection,不但速度慢而且很耗资源,这时就可以用数据库连接池来解决这个问题。
数据库连接池说白拉,就是建一些永久的不会断开的数据库连接,当web页面有要求连接数据库时,就调用其中的一个,用完了再放回去,等待别的页面调用。
 
大唐电信,
这是什么设计模式,是Structs吗?
我学java有一段时间拉,看到你的回复,一头雾水,你是怎摸学的?
 
struts自己有连接池,用它的就行。随便找一本写struts的书都有写。注意类库配置齐全。
 
ff_ff
这跟设计模式和Structs没什么联系,应该算是一种技术吧。
你可以仔细看看上面的代码,其实就是写了两个简单JAVA类,并在JSP页面中应用它。
你还可以网上搜搜,JSP数据库连接池,
相关资料挺多的
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部