最近的一个项目中,因为要使用到多线程,现在在程序中碰到个很郁闷的问题。
就是在线程调度中,getConn();一旦执行到conn = DriverManager.getConnection(ds.getDbUrl(), ds.getUser(), ds.getPassword());就死在那里不往下走,而如果我在线程调度外面执行过一次getConn之后就一切OK,搞不懂其中道理,请各位高手指点。
就是在线程调度中,getConn();一旦执行到conn = DriverManager.getConnection(ds.getDbUrl(), ds.getUser(), ds.getPassword());就死在那里不往下走,而如果我在线程调度外面执行过一次getConn之后就一切OK,搞不懂其中道理,请各位高手指点。
本来就是同步的
应该是线程的问题
将连接放在 ThreadLocal 中使用会更好一点。public static final ThreadLocal session = new ThreadLocal();不会用的话可以在网上看看HibernateUtil 的调研例子.我曾经在网上看到一个用ThreadLocal 封装的 jdbc连接池,解决你这个问题最好。
你可以找找
* Description: 此类用于设计定时执行的任务
*
* @author wunaigang
*/
private class MyTimeTask extends TimerTask{
/**
* 运行主程序
*/
public void run() {
scheduler();
}
/**
* 调度程序
*
*/
private void scheduler(){
String execTime = DateConverter.DateToStr(new Date(), "yyyy-MM-dd HH:mm:ss");
/*扫描目录*/
System.out.println("开始执行第"+ (i++) +"次,当前时间:" + execTime );
Connection conn = null;
try {
Logger.warn("程序就死在这里");
conn = ConnHandle.getConn();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ThreadPoolManager tpm = new ThreadPoolManager();
tpm.process();
}
}
if (strDatasourceName != null && !"".equals(strDatasourceName)){
DataSourceParser sync = new DataSourceParser();
Datasource ds = sync.getDatasource(strDatasourceName);
try {
Class.forName(ds.getDbDriver()).newInstance();
Logger.warn("DbDriver = ["+ ds.getDbDriver() +"]");
Properties props = new Properties();
props.put("user", ds.getUser());
props.put("password", ds.getPassword());
Logger.warn("ds.getDbUrl() = ["+ ds.getDbUrl() +"] ds.getUser()= ["+ ds.getUser() +"]");
conn = DriverManager.getConnection(ds.getDbUrl(), ds.getUser(), ds.getPassword());
}catch (SQLException e) {
System.out.print("\n数据库登陆失败:" + e.getMessage());
e = e.getNextException();
conn = null;
}catch(Exception e){
e.printStackTrace();
}
} return conn;
}
那就只有可能在 Class.forName(ds.getDbDriver()).newInstance(); 了
因为在 Logger.warn("程序就死在这里"); 和 Logger.warn("DbDriver = ["+ ds.getDbDriver() +"]"); 之间,就只有这么两行程序了。