gpt4 book ai didi

单独的线程锁父级中的 Java JDBC 查询

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:03:05 24 4
gpt4 key购买 nike

我在理解这一点时遇到了一些困难。这是正在发生的事情。我正在生成一个新线程,该线程保持与 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", "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, int port, String user,
String password, 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,
user, 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 方法的顺序调用。这并不意味着它将指示 child 执行该方法。相反,父线程将自己执行它,子线程在其 run 方法返回后立即完成。

如果您希望有一个单独的线程不断接收命令以执行查询,您将必须实现生产者-消费者模式,其中父级保持排队命令以供子级执行。为此我推荐你看看ExecutorService .

关于单独的线程锁父级中的 Java JDBC 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12056403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com