The web application [] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped

匿名 (未验证) 提交于 2019-12-03 01:53:01

问题:

I've seen few similar issues on stackoverflow but i could not figure out how i can solve my problem. After adding Spring Security to my Spring MVC project i got following exception:

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. 

Here is my mysql-connecter in the pom.xml

    mysqlmysql-connector-java5.1.31

Here are classes that i've added:

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

and assembler

 @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 authorities = new ArrayList();     authorities.add(new GrantedAuthorityImpl(role));      return new User(user.getLogin(), user.getPassword(), true, true, true, true,  authorities); } } 

Here is my spring-security.xml

EDITED:

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 

回答1:

what i did was just to put the mysql-connector-java-5.1.31-bin.jar in $CATALINA_HOME/lib. no modifications to server.xml.



回答2:

Your application doesn't have a flaw. It is the design of JDBC. The JDBC driver gets loaded and registered by the webapp when it creates a database connection for the first time.

That means that the driver is loaded with the web application class loader. On undeployment the driver doesn't get deregistered which in turn prevents your webapp classes from GC. That creates effectively a memory leak.

To prevent this particular memory leak you should edit your tomcat/conf/server.xml and change

to

Exclude the JDBC driver from your webapp artifact and put it into the tomcat/lib directory. Now the JDBC driver gets loaded by Tomcat on startup and isn't linked to any webapps class loader.

Why should I modify the server.xml?

Another memory leaks manifests due to MySQL's 'Abandoned connection cleanup thread'. This thread starts with the first request and holds a reference to the webapp's classloader. With classesToInitialize you can prevent this memory leak too.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!