L'application web [] enregistré le pilote JDBC [com.mysql.jdbc.Pilote], mais a échoué à annuler son inscription lors de l'application web a été arrêté
J'ai vu quelques-uns des problèmes similaires sur stackoverflow mais je ne pouvais pas comprendre comment je peux résoudre mon problème. Après l'ajout de Printemps de Sécurité de mon Spring MVC projet, j'ai exception suivante:
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.
Voici mon mysql-connecteur dans le pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
Voici les classes que j'ai ajouté:
@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);
}
}
et assembleur
@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);
}
}
Voici mon spring-security.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>
ÉDITÉ:
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
Double Possible de Pour éviter une fuite de mémoire, le Pilote JDBC a été expulsé non
OriginalL'auteur user3127896 | 2014-07-20
Vous devez vous connecter pour publier un commentaire.
ce que j'ai fait était juste pour mettre la mysql-connector-java-5.1.31-bin.jar dans $CATALINA_HOME/lib. aucune modification de la server.xml.
Vous avez raison @titi-wangsa-bin-damhore. Mais il y a une autre racine de fuite de mémoire concernant le pilote JDBC de MySQL: Défavorisés de nettoyage de la connexion fil. Mise à jour de ma réponse à réfléchir.
OriginalL'auteur Titi Wangsa bin Damhore
Votre application n'a pas un défaut. C'est la conception de JDBC. Le pilote JDBC est chargé et enregistré par la webapp lorsqu'il crée une connexion de base de données pour la première fois.
Qui signifie que le pilote est chargé avec l'application web de la classe loader. Sur undeployment le pilote à ne pas avoir radié qui à son tour empêche votre webapp classes de GC. Qui crée effectivement une fuite de mémoire.
Pour empêcher cette fuite de mémoire, vous devriez modifier votre
tomcat/conf/server.xml
et changementà
Exclure le pilote JDBC à partir de votre webapp artefact et le mettre dans le
tomcat/lib
répertoire.Maintenant, le pilote JDBC est chargé par Tomcat au démarrage et n'est pas liée à une quelconque webapps chargeur de classe.
Pourquoi devrais-je modifier l'server.xml?
Un autre fuites de mémoire se manifeste en raison de MySQL 'Abandon de nettoyage de la connexion la discussion". Ce fil commence avec la première demande et contient une référence à la webapp du chargeur de classe. Avec
classesToInitialize
vous pouvez empêcher cette fuite de mémoire aussi.par la façon dont j'ai essayé de mettre mysql-connector-java-5.1.31-bin.jar dans mon /tomcat/lib dossier, mais il ne m'a pas aidé
désolé. j'ai oublié de mentionner que le conducteur devrait être mis dans tomcat/lib. mise à jour de ma réponse. ClassNotFoundException est bizarre! J'ai vérifié mysql-connector-java-5.1.31-bin.jar pour NonRegisteringDriver. Il existe des classes dans le bocal!
problème résolu, merci
OriginalL'auteur Kamill Sokol