站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题多线程中Connection管理问题。

多线程中Connection管理问题。

摘要: 多线程中Connection管理问题。


最近的一个项目中,因为要使用到多线程,现在在程序中碰到个很郁闷的问题。
就是在线程调度中,getConn();一旦执行到conn = DriverManager.getConnection(ds.getDbUrl(), ds.getUser(), ds.getPassword());就死在那里不往下走,而如果我在线程调度外面执行过一次getConn之后就一切OK,搞不懂其中道理,请各位高手指点。


加上 synchronized 关键字!

synchronized synchronized(,,){

}


楼上的解答正确。。。加同步关键字synchronized 。。。一次只调用一个线程就不会有冲突了


学习MARK。


DriverManager.getConnection
本来就是同步的
应该是线程的问题


使用 synchronized 的效果并不好。
将连接放在 ThreadLocal 中使用会更好一点。

public static final ThreadLocal session = new ThreadLocal();

不会用的话可以在网上看看HibernateUtil 的调研例子.

我曾经在网上看到一个用ThreadLocal 封装的 jdbc连接池,解决你这个问题最好。
你可以找找



代码看看


CAYU(中原) 的说法有道理


感谢各位的解答。不过现在还是不行,我原先就是用的synchronized ,刚用了ThreadLocal也还是停在那里不动,现在我用了个连接池,在线程外先生成一个Conn,先度过难关,后面大家再讨论一下吧,为什么在线程外需要先生成一个Connection才可以呢


upCAYU(中原)


你最好还是把那个线程代码发出来看看


/**
* 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();
}
}


ConnHandle的代码呢?


> 为什么在线程外需要先生成一个Connection才可以呢

这个没有道理的。所谓“线程外”,无非是另外一个线程嘛。

还是把代码贴出来看看吧……


public static Connection getConn(String strDatasourceName){

Connection conn = null;
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;
}



DataSourceParser.getDatasource() 的代码呢?

继续帖,hehe :)


DataSourceParser.getDatasource() 只是取得url,driver,user,pwd的信息。没有什么特别的,而且问题也不在这里,我已经测试过这个了。


如果问题不在 Datasource ds = sync.getDatasource(strDatasourceName);
那就只有可能在 Class.forName(ds.getDbDriver()).newInstance(); 了
因为在 Logger.warn("程序就死在这里"); 和 Logger.warn("DbDriver = ["+ ds.getDbDriver() +"]"); 之间,就只有这么两行程序了。


↑返回目录
前一篇: J2SE 1.4 中assertion 功能介绍
后一篇: ibatis NULL 替代值问题