Java 使用MS SQL Server驱动程序和Tomcat进行Spring引导

Java 使用MS SQL Server驱动程序和Tomcat进行Spring引导,java,sql-server,spring,tomcat,spring-boot,Java,Sql Server,Spring,Tomcat,Spring Boot,我正在使用Spring Boot和MS SQL Server 2012创建一个web应用程序。为此,我将驱动程序(sqljdbc4.jar)添加到Maven本地存储库中,并添加了依赖项。我可以在IDE中找到并使用驱动程序: 解决办法是 问题是:为什么Tomcat需要这个库,并且可以在不向Tomcat添加库的情况下运行应用程序?只需将这个依赖项添加到pom.xml(对于maven)或build.gradle中即可。 工件链接- SpringBoot插件将自动将此依赖项打包到jar/war文件中 我

我正在使用Spring Boot和MS SQL Server 2012创建一个web应用程序。为此,我将驱动程序(
sqljdbc4.jar
)添加到Maven本地存储库中,并添加了依赖项。我可以在IDE中找到并使用驱动程序:

解决办法是


问题是:为什么Tomcat需要这个库,并且可以在不向Tomcat添加库的情况下运行应用程序?

只需将这个依赖项添加到pom.xml(对于maven)或build.gradle中即可。
工件链接-
SpringBoot插件将自动将此依赖项打包到jar/war文件中

我找到了我的问题的答案:

JDBC驱动程序在所有web应用程序共享的JVM范围的singleton
DriverManager
中注册自己。如果您从两个不同的web应用程序注册了两次相同的JDBC驱动程序(与类名相同),这可能会导致您的问题。如果您的web应用程序使用同一JDBC驱动程序的不同版本,则问题更大

此外,当您在不重新启动Tomcat的情况下重新部署web应用程序时,将JDBC驱动程序放入Tomcat的lib文件夹将有助于防止内存泄漏,例如,如果您刚刚将新WAR文件放入Tomcat的webapps文件夹:

DriverManager
由引导类加载器加载,因此在JVM中全局“存在”,而Tomcat在其自己的类加载器中加载所有web应用。因此,如果web应用的web-INF/lib文件夹中的JDBC驱动程序在
DriverManager
中注册,它会将该web应用的类加载器固定在内存中(从而将该web应用的所有类都固定在内存中),从而防止其垃圾收集

相反,如果
DriverManager
和JDBC驱动程序都来自非web应用类加载器,则您可以自由重新部署web应用,而无需将任何web应用类固定在从其他类加载器加载的类中


因此pom.xml中的依赖性不是必需的。事实上,如果应用程序由应用程序服务器(war文件而不是jar)运行,它应该被删除。

如我所说。它在我的war文件中,在我的Maven存储库中,在pom.xml中。如果不是,我就无法通过源代码访问驱动程序。但我仍然得到“ClassNotFoundException”。这就是为什么我也必须将它添加到Tomcats libs中。但是我不想这样。所以显示您的pom.xml和war文件中WEB-INF/lib目录的内容我已经用SQLServer配置创建了war文件,对我来说,它正在本地tomcat实例上部署。如果你能分享你的项目。你可以检查我的配置
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>my.service</groupId>
    <artifactId>my-app</artifactId>
    <version>0.1.0</version>
    <packaging>war</packaging>

    <name>my-app</name>
    <description>My App</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
C:\my-app\target\my-app-0.1.0\WEB-INF\lib>dir
03.11.2016  14:17    <DIR>          .
03.11.2016  14:17    <DIR>          ..
27.10.2016  11:48           445.288 antlr-2.7.7.jar
28.10.2016  14:15         1.864.922 aspectjweaver-1.8.9.jar
03.11.2016  14:02            33.218 avalon-framework-api-4.3.1.jar
03.11.2016  14:02            61.021 avalon-framework-impl-4.3.1.jar
03.11.2016  14:02           377.042 batik-anim-1.8.jar
03.11.2016  14:02           301.028 batik-awt-util-1.8.jar
03.11.2016  14:02           529.674 batik-bridge-1.8.jar
03.11.2016  14:02           256.539 batik-css-1.8.jar
03.11.2016  14:02           140.057 batik-dom-1.8.jar
03.11.2016  14:02            10.347 batik-ext-1.8.jar
03.11.2016  14:02            54.735 batik-extension-1.8.jar
03.11.2016  14:02           144.227 batik-gvt-1.8.jar
03.11.2016  14:02            55.269 batik-parser-1.8.jar
03.11.2016  14:02            17.156 batik-script-1.8.jar
03.11.2016  14:02           217.196 batik-svg-dom-1.8.jar
03.11.2016  14:02           177.875 batik-svggen-1.8.jar
03.11.2016  14:02            92.514 batik-transcoder-1.8.jar
03.11.2016  14:02           107.737 batik-util-1.8.jar
03.11.2016  14:02            26.777 batik-xml-1.8.jar
28.10.2016  14:15            64.804 classmate-1.3.1.jar
03.11.2016  14:02            83.613 commons-io-1.3.1.jar
27.10.2016  13:21            38.015 commons-logging-1.0.4.jar
27.10.2016  11:48           313.898 dom4j-1.6.1.jar
03.11.2016  14:02         4.127.117 fop-2.1.jar
28.10.2016  14:15            75.288 hibernate-commons-annotations-5.0.1.Final.jar
28.10.2016  14:15         5.619.712 hibernate-core-5.0.11.Final.jar
28.10.2016  14:15           612.550 hibernate-entitymanager-5.0.11.Final.jar
28.10.2016  14:15           113.371 hibernate-jpa-2.1-api-1.0.0.Final.jar
28.10.2016  14:15           704.465 hibernate-validator-5.2.4.Final.jar
28.10.2016  14:15            55.650 jackson-annotations-2.8.3.jar
28.10.2016  14:15           281.078 jackson-core-2.8.3.jar
28.10.2016  14:15         1.233.703 jackson-databind-2.8.3.jar
28.10.2016  14:15           187.752 jandex-2.0.0.Final.jar
27.10.2016  14:49           750.581 javassist-3.20.0-GA.jar
28.10.2016  14:15            30.724 javax.transaction-api-1.2.jar
28.10.2016  14:15            66.802 jboss-logging-3.3.0.Final.jar
28.10.2016  14:15            16.431 jcl-over-slf4j-1.7.21.jar
28.10.2016  14:15             4.597 jul-to-slf4j-1.7.21.jar
28.10.2016  14:15            23.646 log4j-over-slf4j-1.7.21.jar
28.10.2016  14:15           304.075 logback-classic-1.1.7.jar
28.10.2016  14:15           470.782 logback-core-1.1.7.jar
28.10.2016  14:15            41.071 slf4j-api-1.7.21.jar
28.10.2016  14:15           273.599 snakeyaml-1.17.jar
28.10.2016  14:15           379.939 spring-aop-4.3.3.RELEASE.jar
28.10.2016  14:15            58.720 spring-aspects-4.3.3.RELEASE.jar
28.10.2016  14:15           760.602 spring-beans-4.3.3.RELEASE.jar
28.10.2016  14:15           657.087 spring-boot-1.4.1.RELEASE.jar
28.10.2016  14:15           967.727 spring-boot-autoconfigure-1.4.1.RELEASE.jar
28.10.2016  14:15             2.289 spring-boot-starter-1.4.1.RELEASE.jar
28.10.2016  14:15             2.249 spring-boot-starter-aop-1.4.1.RELEASE.jar
28.10.2016  14:15             2.598 spring-boot-starter-data-jpa-1.4.1.RELEASE.jar
28.10.2016  14:15             2.256 spring-boot-starter-jdbc-1.4.1.RELEASE.jar
28.10.2016  14:15             2.308 spring-boot-starter-logging-1.4.1.RELEASE.jar
28.10.2016  14:15             2.346 spring-boot-starter-web-1.4.1.RELEASE.jar
28.10.2016  14:15         1.134.792 spring-context-4.3.3.RELEASE.jar
28.10.2016  14:15         1.110.374 spring-core-4.3.3.RELEASE.jar
28.10.2016  14:15           693.036 spring-data-commons-1.12.3.RELEASE.jar
28.10.2016  14:15           280.582 spring-data-jpa-1.10.3.RELEASE.jar
28.10.2016  14:15           263.744 spring-expression-4.3.3.RELEASE.jar
28.10.2016  14:15           426.453 spring-jdbc-4.3.3.RELEASE.jar
28.10.2016  14:15           476.863 spring-orm-4.3.3.RELEASE.jar
28.10.2016  14:15           266.965 spring-tx-4.3.3.RELEASE.jar
28.10.2016  14:15           813.281 spring-web-4.3.3.RELEASE.jar
28.10.2016  14:15           913.557 spring-webmvc-4.3.3.RELEASE.jar
30.09.2016  13:51           585.020 sqljdbc4-4.0.jar
28.10.2016  14:15           137.738 tomcat-jdbc-8.5.5.jar
28.10.2016  14:15            41.152 tomcat-juli-8.5.5.jar
27.10.2016  14:19            63.777 validation-api-1.1.0.Final.jar
03.11.2016  14:02         2.730.442 xalan-2.7.0.jar
28.10.2016  14:15           220.536 xml-apis-1.4.01.jar
03.11.2016  14:02            85.686 xml-apis-ext-1.3.04.jar
03.11.2016  14:02           645.023 xmlgraphics-commons-2.1.jar
java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerDriver
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:253) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:181) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:142) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102) ~[tomcat-jdbc.jar:na]
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126) ~[tomcat-jdbc.jar:na]
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) ~[DatasourceConnectionProviderImpl.class:5.0.11.Final]
    at org.hibernate.tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.prepare(SuppliedConnectionProviderConnectionHelper.java:33) ~[SuppliedConnectionProviderConnectionHelper.class:5.0.11.Final]
    at org.hibernate.tool.hbm2ddl.DatabaseExporter.<init>(DatabaseExporter.java:35) ~[DatabaseExporter.class:5.0.11.Final]
    at org.hibernate.tool.hbm2ddl.SchemaExport.execute(SchemaExport.java:425) ~[SchemaExport.class:5.0.11.Final]
    at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:361) ~[SchemaExport.class:5.0.11.Final]
    at org.hibernate.tool.hbm2ddl.SchemaExport.create(SchemaExport.java:350) ~[SchemaExport.class:5.0.11.Final]
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:469) ~[SessionFactoryImpl.class:5.0.11.Final]
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444) ~[SessionFactoryBuilderImpl.class:5.0.11.Final]
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879) [EntityManagerFactoryBuilderImpl.class:5.0.11.Final]
    at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:60) [SpringHibernateJpaPersistenceProvider.class:4.3.3.RELEASE]
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:353) [LocalContainerEntityManagerFactoryBean.class:4.3.3.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:373) [AbstractEntityManagerFactoryBean.class:4.3.3.RELEASE]
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:362) [AbstractEntityManagerFactoryBean.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1642) [AbstractAutowireCapableBeanFactory.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1579) [AbstractAutowireCapableBeanFactory.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545) [AbstractAutowireCapableBeanFactory.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) [AbstractAutowireCapableBeanFactory.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) [AbstractBeanFactory$1.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) [DefaultSingletonBeanRegistry.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) [AbstractBeanFactory.class:4.3.3.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) [AbstractBeanFactory.class:4.3.3.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076) [AbstractApplicationContext.class:4.3.3.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851) [AbstractApplicationContext.class:4.3.3.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541) [AbstractApplicationContext.class:4.3.3.RELEASE]
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) [EmbeddedWebApplicationContext.class:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761) [SpringApplication.class:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371) [SpringApplication.class:1.4.1.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [SpringApplication.class:1.4.1.RELEASE]
    at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:151) [SpringBootServletInitializer.class:1.4.1.RELEASE]
    at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:131) [SpringBootServletInitializer.class:1.4.1.RELEASE]
    at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86) [SpringBootServletInitializer.class:1.4.1.RELEASE]
    at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169) [SpringServletContainerInitializer.class:4.3.3.RELEASE]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5147) [catalina.jar:8.0.3]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:8.0.3]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:726) [catalina.jar:8.0.3]
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:702) [catalina.jar:8.0.3]
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:697) [catalina.jar:8.0.3]
    at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:579) [catalina.jar:8.0.3]
    at org.apache.catalina.startup.HostConfig$DeployDescriptor.run(HostConfig.java:1744) [catalina.jar:8.0.3]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_60]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_60]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_60]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_60]
    at java.lang.Thread.run(Thread.java:745) [na:1.8.0_60]
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
    at java.net.URLClassLoader.findClass(URLClassLoader.java:381) ~[na:1.8.0_60]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_60]
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_60]
    at java.lang.Class.forName0(Native Method) ~[na:1.8.0_60]
    at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_60]
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:245) ~[tomcat-jdbc.jar:na]
    ... 52 common frames omitted