Веб-приложение [] зарегистрировало драйвер JDBC [com.для MySQL.интерфейс jdbc.Driver], но не удалось отменить регистрацию, когда веб-приложение было остановлено

Я видел несколько подобных проблем на stackoverflow, но я не мог понять, как я могу решить свою проблему. После добавления Spring Security в мой проект Spring MVC я получил следующее исключение:

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.

вот мой mysql-connecter в пом.в XML

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.31</version>
    </dependency>

вот классы, которые я добавил:

@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);
}
}

и ассемблер

 @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);
}
}

вот мой весна-безопасность.в XML

<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>

редактировать:

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

2 ответов


то, что я сделал, было просто поставить mysql-connector-java-5.1.31-bin.банка в $ CATALINA_HOME / lib. никаких изменений сервера.XML.


ваше приложение не имеет недостатка. Это дизайн JDBC. Драйвер JDBC загружается и регистрируется webapp при первом создании подключения к базе данных.

это означает, что драйвер загружен загрузчиком класса веб-приложения. При undeployment драйвер не получает регистрацию, которая в свою очередь предотвращает ваши классы webapp от GC. Это создает эффективную утечку памяти.

чтобы предотвратить эту конкретную утечку памяти, вы должны отредактировать ваш tomcat/conf/server.xml, и

<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />

to

<Listener 
className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />

исключите драйвер JDBC из артефакта webapp и поместите его в . Теперь драйвер JDBC загружается Tomcat при запуске и не связан с загрузчиком классов webapps.

почему я должен изменять сервер.в XML?

еще одна утечка памяти проявляется из-за "заброшенного потока очистки соединения MySQL". Этот поток начинается с первого запроса и содержит ссылка на загрузчик классов webapp. С classesToInitialize вы можете предотвратить эту утечку памяти тоже.