首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >web应用程序[]注册了JDBC驱动程序[com.mysql.jdbc.Driver],但在web应用程序停止时未能将其注销。

问web应用程序[]注册了JDBC驱动程序[com.mysql.jdbc.Driver],但在web应用程序停止时未能将其注销。
EN

Stack Overflow用户
提问于 2014-07-20 11:36:28
回答 2查看 42K关注 0票数 15

在堆栈溢出方面,我很少看到类似的问题,但我不知道如何解决我的问题。在我的Spring项目中添加了Security之后,我得到了以下异常:

代码语言:javascript
复制
Jul 20, 2014 3:18:04 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc
SEVERE: The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

下面是我在pom.xml中的mysql连接程序。

代码语言:javascript
复制
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.31</version>
    </dependency>

下面是我添加的一些类:

代码语言:javascript
复制
@Component
@Transactional
public class UserDetailsServiceImpl implements UserDetailsService{

@Autowired
private UserDAO userDAO;

@Autowired
private UserAssembler userAssembler;

private static final Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class);

@Transactional(readOnly = true)
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
    User user = userDAO.findByEmail(username);

    if(null == user) throw new UsernameNotFoundException("User not found");

    return userAssembler.buildUserFromUser(user);
}
}

和汇编程序

代码语言:javascript
复制
 @Service("assembler")

public class UserAssembler {

@Autowired
private UserDAO userDAO;

@Transactional(readOnly = true)
public User buildUserFromUser(net.viralpatel.contact.model.User user) {
    String role = "ROLE_USER";//userEntityDAO.getRoleFromUserEntity(userEntity);

    Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
    authorities.add(new GrantedAuthorityImpl(role));

    return new User(user.getLogin(), user.getPassword(), true, true, true, true,  authorities);
}
}

这是我的spring-security.xml

代码语言:javascript
复制
<beans:bean id="webexpressionHandler" class="org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler" />

<http auto-config="true">
    <intercept-url pattern="/account/*" access="ROLE_ADMIN" />
    <form-login login-page="/login" default-target-url="/account/overview" authentication-failure-url="/login?error=true"/>
    <remember-me/>
</http>

<beans:bean id="myUserDetailsService" class="net.viralpatel.contact.service.UserDetailsServiceImpl" />


<authentication-manager alias="authenticationManager">
    <authentication-provider user-service-ref="myUserDetailsService" />
</authentication-manager>

编辑:

代码语言:javascript
复制
INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: /opt/idea-IU-135.909/bin::/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
Jul 20, 2014 3:58:36 PM org.apache.catalina.core.JreMemoryLeakPreventionListener lifecycleEvent
SEVERE: Failed to load class com.mysql.jdbc.NonRegisteringDriver during Tomcat start to prevent possible memory leaks.
java.lang.ClassNotFoundException: com.mysql.jdbc.NonRegisteringDriver
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-20 12:44:45

我所做的只是把mysql-connector-java-5.1.31-bin.jar放在$CATALINA_HOME/lib里。不修改server.xml。

票数 4
EN

Stack Overflow用户

发布于 2014-07-20 11:53:00

您的应用程序没有缺陷。这是JDBC的设计。当首次创建数据库连接时,JDBC驱动程序将由webapp加载和注册。

这意味着驱动程序加载了web应用程序类加载器。在取消部署时,驱动程序不会被取消注册,这反过来又会阻止您的webapp类从GC中删除。这有效地造成了内存泄漏。

为了防止这种特定的内存泄漏,您应该编辑tomcat/conf/server.xml并更改

代码语言:javascript
复制
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

至

代码语言:javascript
复制
<Listener 
className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />
  • 对于mysql连接器-java-8.0.x,使用com.mysql.cj.jdbc.NonRegisteringDriver代替

将JDBC驱动程序从webapp工件中排除,并将其放到tomcat/lib目录中。现在,JDBC驱动程序在启动时由Tomcat加载,并且没有链接到任何webapp类加载器。

为什么要修改server.xml?

另一个内存泄漏是由于MySQL的“废弃的连接清理线程”造成的。这个线程从第一个请求开始,并保存对webapp的类加载器的引用。使用classesToInitialize,您也可以防止内存泄漏。

参考文献:

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24850091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档