[200分]通过以下DAO操作proxool连接池访问量大的时候,老是有问题?DAO如下:
通过以下DAO操作proxool连接池访问量大的时候,老是有问题?DAO如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.sql.CallableStatement;
public final class DAO implements DBsource,DAO
{
private static Connection conn=null;
private Statement st=null;
ResultSet rs=null;
PreparedStatement ps=null;
CallableStatement cs=null;
public DAO()
{
}
static{
try{
Class.forName( "org.logicalcobwebs.proxool.ProxoolDriver ");
}catch(Exception ex){
ex.printStackTrace();
}
}
private void getConn()
{
try{
conn = DriverManager.getConnection( "proxool.xml-test ");
//conn = DriverManager.getConnection(Url, username, password);
//conn.setAutoCommit(false);//支持事务
}catch (Exception ex){
ex.printStackTrace();
}
}
//负责建立状态通道
private Statement getStatement(){
try {
if(conn==null||conn.isClosed())
{
getConn();
}
st = conn.createStatement();
if(st==null)
{
st=getStatement();
}
}catch (SQLException ex) {
ex.printStackTrace();
}
return st;
}
//
public boolean doBatch(List SQLs){
boolean is=false;
getStatement();
try{
for(int i=0;i <SQLs.size();i++){
st.addBatch(SQLs.get(i).toString());
}
int[] a=st.executeBatch();
// for(int i=0;i <a.length;i++){
// //System.out.println(a[i]+ "记录 ");
// }
is=true;
//conn.commit();
}catch(SQLException ex) {
ex.printStackTrace();
//conn.rollback();
}finally{
Close();
return is;
}
}
//下面是使用预通道的通用方法
public ResultSet execQuery(String sql,String[] args){
try {
if(conn == null || conn.isClosed()) {
getConn();
ps=conn.prepareStatement(sql);
for(int i=1;i <=args.length;i++){
ps.setString(i,args[i-1]);
}
rs=ps.executeQuery();
}
}catch (SQLException ex) {
ex.printStackTrace();
}
return rs;
}
public ResultSet execQuery(String sql,List args)
{
try {
if(conn == null || conn.isClosed()) {
getConn();
ps=conn.prepareStatement(sql);
if(ps==null)
{
getConn();
ps=conn.prepareStatement(sql);
}
if(args!=null)
{
for(int i=1;i <=args.size();i++)
{
ps.setString(i,args.get(i-1).toString());
}
}
rs=ps.executeQuery();
}
}catch (SQLException ex) {
ex.printStackTrace();
}
return rs;
}
public boolean execOperate(String sql,String[] args)
{
boolean isCorrect=false;
try {
if(conn==null||conn.isClosed())getConn();
ps=conn.prepareStatement(sql);
for(int i=1;i <=args.length;i++){
Object Objvalue=args[i-1];
if(Objvalue==null)
ps.setString(i,null);
else
ps.setString(i,Objvalue.toString());
}
int a=ps.executeUpdate();
////System.out.println(a+ "记录 ");
isCorrect=true;
//conn.commit();
}catch (SQLException ex) {
ex.printStackTrace();
}finally{
Close();
}
return isCorrect;
}
//查询
public ResultSet doQuery(String sql)
{
try{
rs=getStatement().executeQuery(sql);
}catch (SQLException ex) {
ex.printStackTrace();
}
return rs;
}
//新增insert into 、、、、、、
public boolean doInsert(String sql)
{
boolean isCorrect=false;
try{
getStatement().execute(sql);//true false(执行增删改查sql)
isCorrect=true;
//conn.commit();
}catch(SQLException ex){
ex.printStackTrace();
//conn.rollback();
}finally{
Close();
return isCorrect;
}
}
public ResultSet execMethod(String sql)
{
try{
boolean is=getStatement().execute(sql);//true false(执行增删改查sql)
if(is==true)rs=st.getResultSet();
}catch(SQLException ex){
ex.printStackTrace();
}finally{
return rs;
}
}
//修改和删除
public boolean doUpdate(String sql)
{
boolean isCorrect=false;
try{
int a=getStatement().executeUpdate(sql);//int
////System.out.println(a+ "记录! ");
isCorrect=true;
//conn.commit();
}catch(SQLException e){
e.printStackTrace();
//conn.rollback();
}finally{
Close();
return isCorrect;
}
}
//得到总记录数select count(*) from dept
public int getCount(String sql)
{
int count=0;
try{
rs=getStatement().executeQuery(sql);
if(rs.next())
{
count=rs.getInt(1);
}
}catch(Exception e){
e.printStackTrace();
}finally{
Close();
return count;
}
}
public String getOneValue(String sql)
{
String count= " ";
try{
rs=getStatement().executeQuery(sql);
if(rs.next())
{
count=rs.getString(1);
}
}catch(Exception e){
e.printStackTrace();
}finally{
Close();
return count;
}
}
public int getPK(String tablename,String pkname)
{
int pk=0;
String sql= "select max( "+pkname+ ") from "+tablename;
try{
rs=this.doQuery(sql);
rs.next();
pk=rs.getInt(1)+1;
}catch(Exception e){
e.printStackTrace();
}finally{
this.Close();
return pk;
}
}
public List getCols(String sql)
{
List list=new ArrayList();
try{
rs=this.doQuery(sql);
int colcount=rs.getMetaData().getColumnCount();
while(rs.next())
{
for(int i=1;i <=colcount;i++)
{
list.add(rs.getString(i));
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
Close();
return list;
}
}
public List getCols(String sql,List args)
{
List list=new ArrayList();
try{
rs=this.execQuery(sql, args);
int colcount=rs.getMetaData().getColumnCount();
while(rs.next())
{
for(int i=1;i <=colcount;i++)
{
list.add(rs.getString(i));
}
}
}catch(Exception e){
e.printStackTrace();
}finally{
Close();
return list;
}
}
/************************************************************************************/
public void Close()
{
try{
if(rs!=null)rs.close();
//if(st!=null)st.close();
if(conn!=null)conn.close();
//if(ps!=null)ps.close();
if(cs!=null)cs.close();
}catch (SQLException ex) {
ex.printStackTrace();
}
}
}
[解决办法]
怎么两个贴一样的?
楼主为何在DAO.close()方法中关闭connection却不关闭其它?
而且rs在JSP中已经关闭了,在dao中却又关闭一次?
mysql数据库就不能用应该是proxool的连接用完了,很多有效连接被废置,这个还需要检查proxool的配置。
比如有个配置项是house-keeping-test-sql,如果这条语句配置不正确也会引发该问题,我们是用:select CURRENT_DATE
[解决办法]
可以把dao中的connection设为static
你出的错误应该是连接太多!
这样保证解决问题!
[解决办法]
学习
[解决办法]
报甚麽错?
[解决办法]
错误信息呢
[解决办法]
应该在DAO中对结果集进行封装,在进行查询完了之后要立即释放结果集,statement,还有数据库连接。
[解决办法]
看看对你有没有帮助.
http://blog.csdn.net/rainv/archive/2007/03/14/1529270.aspx