当前页面: 开发资料首页 → 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() +"]"); 之间,就只有这么两行程序了。