我需要在tomcat启动之后不停的执行某些操作,所以写了三个servlet,都是在服务器启动的时候加载的,然后在servlet中开线程,自动的执行。但是出现一个问题,tomcat一启动,在servlet中连接数据库的时候,有时候会出现如下错误:
    java.sql.SQLException: No suitable driver found for jdbc:sqlserver://192.168.1.23; DatabaseName=RFIDPTLSM
at java.sql.DriverManager.getConnection(DriverManager.java:602)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at net.superrfid.common.dataMaintain.thread.DataMaintain.run(DataMaintain.java:48)
at java.lang.Thread.run(Thread.java:619)
但是前两个servlet中连接数据库就不会出现这个问题,代码都是一样的,线程类中的run()方法如下:
     public void run() {
this.xmlP();
Connection dbConn;
DataMaintainDao dao;
while (true) {
try {
dbConn = DriverManager.getConnection(DB_URL,DB_USERNAME,DB_PASSWORD);
dbConn.setAutoCommit(true);

dao = new DataMaintainDao();
dao.maintainRealtimeData(dbConn);

// 每8秒钟运行一次
Thread.sleep(8*1000);

} catch (InterruptedException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
但是有时候就不会有上面的异常,很郁闷。最后我在servlet中开启线程之前先sleep()三四秒,这就没有问题了。不知道到底怎么回事儿。劳烦各位看看!

解决方案 »

  1.   

    真有这事?难道JDBC驱动包往类路径中加还需要占用时间以至于让Servlet抢先?
      

  2.   

    这段代码中有一个大漏勺: 没有看到dbConn.close(). 
      

  3.   

        上面说到我在servlet中开启线程之前先sleep()三四秒,这就没有问题了。今天又试用了另一种方法,在数据库连接的时候没有使用JDBC的方式连接,而是采用了如下方式:
        SQLServerDriver drv = new SQLServerDriver();
        Properties p = new Properties();
        String url = DB_URL+";user="+DB_USERNAME+";password="+DB_PASSWORD+";";
        Connection dbConn = drv.connect(url, p);
        采用这种方式连接数据库之后,servlet中不使用sleep(3*1000)也没有问题了。之前要在同一个方法中连接两个数据库,用JDBC不能实现,就直接使用了如上的方式连接两个数据库。现在这个问题中又试用上述方式连接数据库从而避免了java.sql.SQLException: No suitable driver found for jdbc:sqlserver这样的异常。
        采用JDBC和直接试用SQLServerDriver包连接数据库到底有何区别?劳烦各位说说。
      

  4.   

    可能是动态加载和静态加载类的差别。
    我猜你先前用的是forName动态加载Driver类的。
      

  5.   

    Tomcat 启动 servlet 是后顺序的,不指定的话,当访问时启动,指定的话会在Tomcat 启动时启动。
      

  6.   


    web.xml中如下:
    <servlet>
      <servlet-name>DataMaintainServlet</servlet-name>
      <servlet-class>net.superrfid.common.dataMaintain.servlet.DataMaintainServlet</servlet-class>
      <load-on-startup>3</load-on-startup>
    </servlet>
      

  7.   

    你在哪个地方装载驱动,Class.forName(...) 的那个,应该是这一句在执行线程之后执行才会出现问题。