用户定义的java.sql.ResultSet

用户定义的java.sql.ResultSet,java,connection-pooling,resultset,Java,Connection Pooling,Resultset,我有一个需要优化的旧应用程序,其中我的方法返回java.sql.ResultSet,而且我有一个连接,所以现在我需要实现连接池。问题是,如果我关闭连接,ResultSet将在执行rs.next()时出现异常所以我想要一个类似于ResultSet的类,我们可以说它是从连接中分离出来的,这样我就不必在我使用了ResultSet对象的JSP上进行更改。以下是我的建议: 编写持久化方法,以便传入连接。让另一个对象(例如服务)管理从池中获取连接、事务和清理 持久化类应该在方法范围内创建并关闭Prepare

我有一个需要优化的旧应用程序,其中我的方法返回
java.sql.ResultSet
,而且我有一个连接,所以现在我需要实现连接池。问题是,如果我关闭连接,ResultSet将在执行
rs.next()时出现异常
所以我想要一个类似于ResultSet的类,我们可以说它是从连接中分离出来的,这样我就不必在我使用了
ResultSet
对象的JSP上进行更改。

以下是我的建议:

编写持久化方法,以便传入连接。让另一个对象(例如服务)管理从池中获取连接、事务和清理

持久化类应该在方法范围内创建并关闭
PreparedStatement
ResultSet
对象。不要传递
结果集
;将其映射到某种对象或数据结构中,并将其返回给调用者

您的JSP不应该处理
结果集
。当您调用持久性层时,它们应该迭代您将
ResultSet
映射到的对象或数据结构

让我猜猜:您的JSP中充满了Scriptlet。你也必须把它扔掉。是学习JSTL的时候了


阅读有关Model-2 MVC的信息。

以下是我的建议:

编写持久化方法,以便传入连接。让另一个对象(例如服务)管理从池中获取连接、事务和清理

持久化类应该在方法范围内创建并关闭
PreparedStatement
ResultSet
对象。不要传递
结果集
;将其映射到某种对象或数据结构中,并将其返回给调用者

您的JSP不应该处理
结果集
。当您调用持久性层时,它们应该迭代您将
ResultSet
映射到的对象或数据结构

让我猜猜:您的JSP中充满了Scriptlet。你也必须把它扔掉。是学习JSTL的时候了


了解Model-2 MVC。

获得了我使用的解决方案
CachedRowSet

package taher.connection;
import com.sun.rowset.CachedRowSetImpl;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.rowset.CachedRowSet;
import org.apache.commons.dbcp.BasicDataSource;

/**
 *
 * @author taher_JAVAHUNTER
 */

public class DataTransaction {

private final static String username = "test";
private final static String password = "test";
private final static String url = "jdbc:mysql://127.0.0.1:3309/test";
public Connection connection = null;
public Statement statement = null;
ResultSet rs = null;
public static int connectionCount = 0;

public DataTransaction(boolean setCon) {
    try {
        setConnection();
    } catch (Exception e) {
        System.out.println("Error in Connection:" + e.toString());
    }
}
public static BasicDataSource dataSource;

public void setConnection() throws SQLException {
    try {
        if (dataSource == null) {
            dataSource = new BasicDataSource();
            String driver = "com.mysql.jdbc.Driver";
            try {
                dataSource.setDriverClassName(driver);
                dataSource.setUrl(url);
                dataSource.setUsername(username);
                dataSource.setPassword(password);
                dataSource.setMaxActive(100);
                dataSource.setMaxWait(10000);
                dataSource.setMaxIdle(10);
                if (connection == null || connection.isClosed()) {
                    System.out.println(" requeition CONNECTION WITH FIRST SERVER.");
                    connection = dataSource.getConnection();
                    connectionCount++;
                }
            } catch (SQLException e) {
                System.out.println("***Connection Requisition*** Could not connect to the database msg :" + e.getMessage());
            }
        } else {
            System.out.println("NumActive : "+dataSource.getNumActive());
            System.out.println("NumIdle : "+dataSource.getNumIdle());
            System.out.println("NumTestsPerEvictionRun : "+dataSource.getNumTestsPerEvictionRun());
            if (connection == null || connection.isClosed()) {
                connection = dataSource.getConnection();
                connectionCount++;
            }
        }
    } catch (Exception e) {
        System.out.println("open connection exception" + e);
    }
}

public CachedRowSet viewQuery(String query) throws SQLException, Exception {
    //query = query;
    CachedRowSetImpl crs = new CachedRowSetImpl();
    CachedRowSet crs2 = null;

    try {
        if (connection.isClosed()) {
            setConnection();
        }
    System.out.println("Connection count 1 : " + connectionCount);

        statement = connection.createStatement();
        rs = statement.executeQuery(query);

        crs.populate(rs);
        crs2 = crs.createCopy();
        closeConnection();
        System.out.println("Connection count 2 : " + connectionCount);

    } catch (Exception e) {
        e.printStackTrace();
    }

    return crs2;
}

public void closeConnection() throws SQLException {
    try {
        if (statement != null) {
            statement.close();
        } else {
        }
        if (connection != null) {
            connection.close();                
        }
    } catch (Exception e) {
    }


}

public static void main(String[] args) throws SQLException, Exception {
    DataTransaction dt = new DataTransaction(true);
    for (int i = 0; i < 10; i++) {
        ResultSet rs = dt.viewQuery("select * from tbl_test");
        //ResultSet rs = dt.viewQuery("select * from tbl_test",0);
        System.out.println("Connection closed : " + dt.connection.isClosed());
        while (rs.next()) {
            System.out.println("testId : " + rs.getString(1));
            System.out.println("testName : " + rs.getString(2));
        }
    }

}
}
package-taher.connection;
导入com.sun.rowset.CachedRowSetImpl;
导入java.sql.Connection;
导入java.sql.ResultSet;
导入java.sql.SQLException;
导入java.sql.Statement;
导入javax.sql.rowset.CachedRowSet;
导入org.apache.commons.dbcp.BasicDataSource;
/**
*
*@author taher_JAVAHUNTER
*/
公共类数据事务{
私有最终静态字符串username=“test”;
私有最终静态字符串password=“test”;
私有最终静态字符串url=“jdbc:mysql://127.0.0.1:3309/test";
公共连接=空;
公开声明=null;
结果集rs=null;
公共静态int-connectionCount=0;
公共数据事务(布尔setCon){
试一试{
setConnection();
}捕获(例外e){
System.out.println(“连接错误:+e.toString());
}
}
公共静态源数据源;
public void setConnection()引发SQLException{
试一试{
如果(数据源==null){
dataSource=新的BasicDataSource();
String driver=“com.mysql.jdbc.driver”;
试一试{
dataSource.setDriverClassName(驱动程序);
setUrl(url);
dataSource.setUsername(用户名);
dataSource.setPassword(密码);
dataSource.setMaxActive(100);
dataSource.setMaxWait(10000);
dataSource.setMaxIdle(10);
if(connection==null | | connection.isClosed()){
System.out.println(“与第一台服务器的重新请求连接”);
connection=dataSource.getConnection();
connectionCount++;
}
}捕获(SQLE异常){
System.out.println(“***连接请求***无法连接到数据库消息:”+e.getMessage());
}
}否则{
System.out.println(“NumActive:+dataSource.getNumActive());
System.out.println(“NumIdle:+dataSource.getNumIdle());
System.out.println(“NumTestsPerEvictionRun:+dataSource.getNumTestsPerEvictionRun());
if(connection==null | | connection.isClosed()){
connection=dataSource.getConnection();
connectionCount++;
}
}
}捕获(例外e){
System.out.println(“开放连接异常”+e);
}
}
public CachedRowSet viewQuery(字符串查询)抛出SQLException,Exception{
//查询=查询;
CachedRowSetImpl crs=新的CachedRowSetImpl();
CachedRowSet crs2=null;
试一试{
if(connection.isClosed()){
setConnection();
}
System.out.println(“连接计数1:+connectionCount”);
statement=connection.createStatement();
rs=语句执行(查询);
crs.填充(rs);
crs2=crs.createCopy();
closeConnection();
System.out.println(“连接计数2:+connectionCount”);
}捕获(例外e){
e、 printStackTrace();
}
返回crs2;
}
public void closeConnection()引发SQLException{
试一试{
if(语句!=null){
语句。close();
}否则{
}
if(连接!=null){
connection.close();
}
}捕获(例外e){
}
}
公共静态void main(字符串[]args)引发SQLException,异常{
DataTransaction dt=新的DataTransaction(真);
对于(int i=0;i<10;i++){
结果集rs=dt.viewQuery(“从tbl_测试中选择*);
//结果集rs=dt.viewQuery(“从tbl_测试中选择*”,0);
System.out.println(“连接关闭:”+dt.Connection.isClosed