关于以下问题,我需要你的帮助: 我有两个帖子。
第一个主题:应该使用标准输入的Scanner类读取用户的输入
扫描仪扫描仪=新扫描仪(System.in);
并且正在等待整个字符串。这个帖子首先到方法next()。
第二个线程到达并尝试使用jdbc - odbc打开连接。
connection = DriverManager.getConnection(“jdbc:odbc:baza”);
正在发生的是方法getConnection()和第二个线程被第一个阻塞。我的问题是为什么会发生这种情况?我怎么能防止这种情况?
我从我的项目中创建了一些小代码,因此更容易阅读..
我感兴趣的另一件事是
的Class.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'");
}
}
答案 0 :(得分:-1)
我的程序可以使用和不支持吗? java默认加载驱动程序吗?
使用Java 7
的{{1}}这是可选的。它将自动在类路径中找到正确的驱动程序类并加载它。无需使用JDBC 4
加载它。但是对于早期版本,你必须这样做。
关于你的死锁问题,如果你说的真正原因是你可以在启动线程后调用Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
join()
如果您说您的代码正在等待
thread.start();
thread.join();
这似乎是一种死锁情况,因为即使扫描仪正在等待用户输入,那么我认为您的连接需要很长时间才能连接。您可以尝试为此指定超时。你可以通过
来做到这一点connection = DriverManager.getConnection("jdbc:odbc:baza");