Java JDBC查询在单独的线程锁父级中
发布时间:2020-05-28 12:08:34 所属栏目:Java 来源:互联网
导读:我在理解这个问题上遇到了一些麻烦. 这是正在发生的事情. 我正在生成一个新的线程,它保存与Oracle数据库的JDBC连接. 当我要求它连接到数据库时,父线程在调用start()方法时继续运行但是当我要求子进行查询时(在单独的方法上),父线程被卡住等待子线程的完成工作
|
我在理解这个问题上遇到了一些麻烦.
public class Main extends Thread{
public Main()
{
}
public void myCounter() {
int i = 0;
DBConnection myConnection = null;
for(;;)
{
i++;
System.out.println("time: " + i);
if( i == 5)
{
myConnection = new DBConnection("localhost",1521,"hr","XE");
myConnection.start();
}
if(i == 10)
try {
myConnection.runQuery("Select * from hr.numbers order by dbms_random.value");
} catch (SQLException e) {
e.printStackTrace();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void run()
{
myCounter();
}
public static void main(String[] args) {
Main boot = new Main();
boot.start();
}
}
public class DBConnection extends Thread{
Connection myConnection;
int port;
String user;
String password;
String serviceName;
String host;
public void run()
{
setUpConnection(host,port,user,password,serviceName);
}
/**
* Sets up variables to create a connection to Oracle.
*
* @param host host
* @param port port
* @param user user
* @param password password
*/
public DBConnection(String host,int port,String user,String password,String serviceName)
{
this.host = host;
this.port = port;
this.user = user;
this.password = password;
this.serviceName = serviceName;
}
private void setUpConnection(String host,String dataBase) {
System.out.println("-------- Oracle "
+ "JDBC Connection Testing ------------");
try {
Class.forName("oracle.jdbc.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("Couldn't find Oracle JDBC Driver... :-(");
e.printStackTrace();
return;
}
System.out.println("Oracle JDBC Driver Registered!");
myConnection = null;
try {
myConnection = DriverManager.getConnection(
"jdbc:oracle:thin:@//"
+ host
+ ":"
+ port
+ "/"
+ dataBase,password
);
} catch (SQLException e) {
System.out.println("Connection Failed!");
e.printStackTrace();
return;
}
if (myConnection != null) {
System.out.println("Connected to Oracle! :-)");
} else {
System.out.println("Failed to make connection!");
}
}
/**
* Queries the database and returns a ResultSet
* @param query SQL
* @throws SQLException
*/
public ResultSet runQuery(String query) throws SQLException
{
System.out.println(" [DBConnection] Started Running @ " + (new SimpleDateFormat("HH:mm:ss:S")).format(new Date()));
ResultSet rs = null;
Statement stt = myConnection.createStatement();
rs = stt.executeQuery(query);
System.out.println(" [DBConnection] Finished Running @: " + (new SimpleDateFormat("HH:mm:ss:S")).format(new Date()));
return rs;
}
这是我得到的输出: time: 1
time: 2
time: 3
time: 4
time: 5
-------- Oracle JDBC Connection Testing ------------
Oracle JDBC Driver Registered!
time: 6
Connected to Oracle! :-)
time: 7
time: 8
time: 9
time: 10
[DBConnection] Started Running @ 14:46:00:660
[DBConnection] Finished Running @: 14:46:12:750
time: 11
time: 12
time: 13
time: 14
… 解决方法我认为你误解了线程的工作原理.问题是你在父线程上调用它:myConnection.runQuery("Select * from hr.numbers order by dbms_random.value");
这是对myConnection对象上的runQuery方法的顺序调用,恰好是一个线程.这并不意味着它会指示孩子执行该方法.相反,父级将自己执行它,并且子线程在其run方法返回后立即完成. 如果您希望有一个单独的线程继续接收执行查询的命令,则必须实现生产者 – 消费者模式,其中父级保持排队命令以便子进程执行.为此我建议你看看ExecutorService. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
