服务启动时加载的servlet报错

wymaweiyue 2011-02-19 02:29:04
我需要在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()三四秒,这就没有问题了。不知道到底怎么回事儿。劳烦各位看看!
...全文
154 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
幽饮烛 2011-02-22
  • 打赏
  • 举报
回复
你在哪个地方装载驱动,Class.forName(...) 的那个,应该是这一句在执行线程之后执行才会出现问题。
海会圣贤 2011-02-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zssazrael 的回复:]
你在哪个地方装载驱动,Class.forName(...) 的那个,应该是这一句在执行线程之后执行才会出现问题。
[/Quote]

同问。
wymaweiyue 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zssazrael 的回复:]

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

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>
幽饮烛 2011-02-20
  • 打赏
  • 举报
回复
Tomcat 启动 servlet 是后顺序的,不指定的话,当访问时启动,指定的话会在Tomcat 启动时启动。
magong 2011-02-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wymaweiyue 的回复:]

采用JDBC和直接试用SQLServerDriver包连接数据库到底有何区别?劳烦各位说说。
[/Quote]
可能是动态加载和静态加载类的差别。
我猜你先前用的是forName动态加载Driver类的。
wymaweiyue 2011-02-20
  • 打赏
  • 举报
回复
上面说到我在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包连接数据库到底有何区别?劳烦各位说说。
wymaweiyue 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 magong 的回复:]

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

这个不清楚,但是结果确实如我开始所说。我也很奇怪。
wymaweiyue 2011-02-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 caili314 的回复:]

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

这个东西还真没有写。弄上去。
caili314 2011-02-19
  • 打赏
  • 举报
回复
这段代码中有一个大漏勺: 没有看到dbConn.close().
magong 2011-02-19
  • 打赏
  • 举报
回复
真有这事?难道JDBC驱动包往类路径中加还需要占用时间以至于让Servlet抢先?

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧