java多线程、数据库连接池出错,请高手指正,谢谢!

程序运行会报关闭的语句:next错误,请高手指正,谢谢!1、TEST类,启动两个线程。packagemain;publicclassTest{publicstaticvo... 程序运行会报 关闭的语句: next 错误,请高手指正,谢谢!
1、TEST类,启动两个线程。
package main;
public class Test {
public static void main(String[] args){
TestThread t1 =new TestThread();
t1.setName("T1 ");
t1.start();
TestThread t2 =new TestThread();
t2.setName("T2 ");
t2.start();
}
}
2、线程类
package main;

import java.sql.ResultSet;
public class TestThread extends Thread {
int i = 0;
public void run() {
while (i < 20) {
i++;
try {
ResultSet rs = Controller.getInstance().getDB().Query("select SYSTIMESTAMP from dual");
while (rs.next())
System.out.println(rs.getString(1));
System.out.println(this.getName() + i);
Thread.sleep(10);
} catch (Exception e) {
System.out.println(this.getName() + i + " " + e.getMessage());
}
}
}
}
3、控制类
package main;

import datebase.OraPooledSQL;

public class Controller {
static Controller Instance = new Controller();
private OraPooledSQL DB = new OraPooledSQL();
public static Controller getInstance() {
return Instance;
}
public OraPooledSQL getDB() {
return DB;
}
}
4、数据库操作类
package datebase;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.PooledConnection;
import oracle.jdbc.pool.OracleConnectionPoolDataSource;

public class OraPooledSQL {
private PooledConnection dbpool;
public OraPooledSQL() {
try {
String ConnectionURL = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
String UserID = "ivruser";
String PassWord = "ivruser123";
OracleConnectionPoolDataSource ocpds = new OracleConnectionPoolDataSource();
ocpds.setURL(ConnectionURL);
ocpds.setUser(UserID);
ocpds.setPassword(PassWord);
dbpool = ocpds.getPooledConnection();
} catch (Exception ex) {
System.err.println("Error in PooledSQL-construct ");
ex.printStackTrace(System.err);
}
}
protected void finalize() {
if (dbpool != null) {
try {
System.out.println("finalize");
dbpool.close();
} catch (Exception ex) {
}
}
}
public synchronized ResultSet Query(String SQL) throws SQLException {
Statement stmt = null;
ResultSet rs = null;
Connection connection = null;
connection = dbpool.getConnection();
stmt = connection.createStatement();
rs = stmt.executeQuery(SQL);
return rs;
}
}
展开
 我来答
若以下回答无法解决问题,邀请你更新回答
百度网友ae0e3fd25
2011-06-01 · 超过10用户采纳过TA的回答
知道答主
回答量:41
采纳率:0%
帮助的人:24万
展开全部
请问出错提示是什么呢?贴上来吧
追问
while (rs.next())
System.out.println(rs.getString(1));
这个地方出错,提示 关闭的语句: next 错误
谢谢
追答
我没测试你的代码,只是看了代码之后有点想法:
线程一的调用OraPooledSQL 的方法Query返回rs后,OraPooledSQL就解锁了,此时线程一的rs或许还没遍历完,线程二开始调用OraPooledSQL 的Query方法,因为二个线程用的是一个OraPooledSQL 对象,所以线程一的rs会关闭,就出错了。

你出错前连一个输出也没有吗?debug一下。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式