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

解决方案 »

  1.   

    加上 synchronized 关键字!synchronized  synchronized(,,){}
      

  2.   

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

  3.   

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

  4.   

    使用 synchronized  的效果并不好。
    将连接放在 ThreadLocal 中使用会更好一点。public static final ThreadLocal session = new ThreadLocal();不会用的话可以在网上看看HibernateUtil 的调研例子.我曾经在网上看到一个用ThreadLocal 封装的 jdbc连接池,解决你这个问题最好。
    你可以找找
      

  5.   

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

  6.   

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

  7.   

    > 为什么在线程外需要先生成一个Connection才可以呢这个没有道理的。所谓“线程外”,无非是另外一个线程嘛。还是把代码贴出来看看吧……
      

  8.   

    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;    
    }
      

  9.   

    DataSourceParser.getDatasource() 的代码呢?继续帖,hehe  :)
      

  10.   

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

  11.   

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