Java 使用MS SQL Server驱动程序和Tomcat进行Spring引导
我正在使用Spring Boot和MS SQL Server 2012创建一个web应用程序。为此,我将驱动程序(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文件中 我
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