registered the JDBC driver [com.microsoft.jdbc.sqlserver.SQLServerDriver] but failed to unregister

1.问题描述

使用的Tomcat的版本是6.0.30,使用的数据库是SQL Server 2000,首次启动Tomcat并运行没有问题。但是当在MyEclipse选中该项目,想要重新部署,进行redeploy时,控制台会出现下面的信息:

严重: The web application [XXX] registered the JDBC driver [com.microsoft.jdbc.sqlserver.SQLServerDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

2.问题分析和解决方案

       这个问题时Tomcat6之后的一个bug,在程序关闭时无法注销此驱动,Tomcat进行内存溢出检测,为了防止溢出,给强制注销了。

首先,重写BasicDataSource中的close方法。

import java.sql.DriverManager;
import java.sql.SQLException;
import org.apache.commons.dbcp.BasicDataSource;

public class MyBasicDataSource extends BasicDataSource{
 @Override
 public synchronized void close() throws SQLException{

  DriverManager.deregisterDriver(DriverManager.getDriver(url));
  super.close();
 }
}

其次,在applicationContext.xml中添加destroy-method="close",部分代码如下

<bean id="dataSource"
		class="com.tkl.hibernateutils.MyBasicDataSource" <strong>destroy-method="close"></strong>        
		<property name="driverClassName"
			value="com.microsoft.jdbc.sqlserver.SQLServerDriver">
		</property>









### 问题分析 无法加载SQL Server JDBC驱动类的问题通常由以下几个原因引起:JDBC驱动未正确安装、配置错误或版本不兼容。以下是针对此问题的详细解决方案。 --- ### 解决方案 #### 1. 确保JDBC驱动已正确安装 Kettle Spoon工具本身并不包含所有数据库的JDBC驱动,因此需要手动下载并安装对应的驱动程序。具体操作如下: - 下载适用于SQL Server的JDBC驱动(`mssql-jdbc-x.x.x.jre8.jar` 或更高版本),可以从微软官方站点获取[^1]。 - 将下载的JAR文件复制到Spoon工具的`lib`目录中,例如:`<KETTLE_HOME>/lib`。 - 重新启动Spoon工具以确保新添加的JAR文件生效。 --- #### 2. 检查配置文件中的URL和驱动类名 在配置数据库连接时,确保以下参数设置正确: - **连接URL**:格式应为 `jdbc:sqlserver://<主机>:<端口>;databaseName=<数据库名称>`。例如: ```properties jdbc:sqlserver://localhost:1433;databaseName=testdb ``` - **驱动类名**:必须指定为 `com.microsoft.sqlserver.jdbc.SQLServerDriver`。 - **用户名和密码**:确保提供的凭据与目标数据库匹配。 示例配置如下: ```properties jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=testdb jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver jdbc.username=sa jdbc.password=your_password ``` 如果使用的是XML配置文件(如Hibernate),则可以参考以下示例[^4]: ```xml <property name="hibernate.connection.driver_class">com.microsoft.sqlserver.jdbc.SQLServerDriver</property> <property name="hibernate.connection.url">jdbc:sqlserver://localhost:1433;DatabaseName=testdb</property> <property name="hibernate.connection.username">sa</property> <property name="hibernate.connection.password">your_password</property> ``` --- #### 3. 验证驱动版本与SQL Server版本的兼容性 确保下载的JDBC驱动版本与SQL Server版本兼容。例如: - SQL Server 2017 及更高版本建议使用 `mssql-jdbc-9.x.x.jre8.jar`。 - 更早版本的SQL Server可能需要使用较低版本的驱动。 可以通过微软官方文档验证兼容性[^3]。 --- #### 4. 检查Java环境与驱动的兼容性 如果使用的Java运行时环境(JRE)与JDBC驱动不兼容,也可能导致加载失败。例如: - 如果使用的是OpenJDK,请确保其版本与JDBC驱动的最低要求一致。 - 建议使用与JDBC驱动相匹配的JDK版本(如JDK 8或JDK 11)。 --- #### 5. 排查其他潜在问题 - **检查配置文件中的空格**:某些情况下,配置文件中的多余空格可能导致解析失败。确保类似以下格式的内容没有多余空格[^2]: ```properties jdbc.url=jdbc:sqlserver://localhost:1433;databaseName=testdb jdbc.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver ``` - **测试驱动是否可用**:可以在独立的Java应用程序中测试驱动是否能够正常加载。示例代码如下: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class TestDriver { public static void main(String[] args) { String url = "jdbc:sqlserver://localhost:1433;databaseName=testdb"; String user = "sa"; String password = "your_password"; try { Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection conn = DriverManager.getConnection(url, user, password); System.out.println("Connection successful!"); conn.close(); } catch (ClassNotFoundException | SQLException e) { e.printStackTrace(); } } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值