我需要你的帮助,关于以下问题:我有两个线程。
第一个线程:应该使用Scanner类从标准输入读取用户输入
Scanner = new Scanner(System.in);
正在等待整个字符串。这个线程首先获得了方法next()的。
第二个线程在此之后到达,并且正在尝试使用jdbc - odbc打开连接。
connection = DriverManager.getConnection("jdbc:odbc:baza");
发生的是方法getConnection()和第二个线程被第一个线程阻塞。我的问题是为什么会这样?我怎样才能避免呢?
我已经从我的项目中创建了小代码,所以它更容易阅读…
我更感兴趣的是为什么
forname("sun.jdbc.odbc.JdbcOdbcDriver");
是可选的。我的程序在有和没有它的情况下都可以工作?java是否默认加载驱动程序?
代码:public class StartingHere implements Runnable {
public static void main(String[] args) {
//SECOND THREAD
try {
StartingHere sh = new StartingHere();
Thread thread = new Thread(sh);
thread.start();
//DELAYING SECOND THREAD.
Thread.currentThread().sleep(1000);
DBConnection dbConnection = new DBConnection();
} catch (Exception ex) {
System.out.println("Check db url for in DBConnection");
ex.printStackTrace();
}
}
@Override
public void run() {
//FIRST THREAD - Waiting for user to input String
String userInput = null;
Scanner scanner = new Scanner(System.in);
while(!"end".equals(userInput)) {
//Waiting for whole string
userInput = scanner.next();
}
}
}
public class DBConnection {
Connection connection;
public DBConnection() throws SQLException, ClassNotFoundException {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
// SECOND THREAD- Problem! Here program hangs until FIRST THREAD got some input.. why?
connection = DriverManager.getConnection("jdbc:odbc:baza");
System.out.println("DBConnection: 'Connected'");
}
}
我的程序有和没有它工作吗?java是否默认加载驱动程序?
对于使用JDBC 4
的Java 7
,这是可选的。它将自动在类路径中找到正确的驱动程序类并加载它。不需要使用Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
加载它。但是对于更早的版本,你必须。
关于你的死锁问题,如果你所说的原因是真的,那么你可以在启动线程后调用join()
thread.start();
thread.join();
如果你说你的代码在
等待connection = DriverManager.getConnection("jdbc:odbc:baza");
,这似乎是一个死锁的情况,因为即使扫描仪正在等待用户输入,那么我认为你的连接需要很长时间才能连接。您可以通过为此指定超时来尝试。你可以通过
DriverManger.setLoginTimeout(10);