use*_*896 11 nhibernate tomcat spring-mvc spring-security
我在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.
Run Code Online (Sandbox Code Playgroud)
这是我在pom.xml中的 mysql-connecter
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.31</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我添加的课程:
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
和汇编程序
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的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>
Run Code Online (Sandbox Code Playgroud)
编辑:
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
Run Code Online (Sandbox Code Playgroud)
Kam*_*kol 17
您的申请没有缺陷.它是JDBC的设计.第一次创建数据库连接时,webapp会加载并注册JDBC驱动程序.
这意味着驱动程序加载了Web应用程序类加载器.在取消部署时,驱动程序不会被取消注册,这反过来会阻止您的Web应用程序类.这有效地造成了内存泄漏.
为防止此特定内存泄漏,您应编辑tomcat/conf/server.xml并更改
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
Run Code Online (Sandbox Code Playgroud)
至
<Listener
className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />
Run Code Online (Sandbox Code Playgroud)
从webapp工件中排除JDBC驱动程序并将其放入tomcat/lib目录中.现在,JDBC驱动程序在启动时由Tomcat加载,并且未链接到任何webapps类加载器.
我为什么要修改server.xml?
由于MySQL的"被遗弃的连接清理线程",另一个内存泄漏显现.该线程从第一个请求开始,并保存对webapp的类加载器的引用.随着classesToInitialize您可以防止这种内存泄漏了.
| 归档时间: |
|
| 查看次数: |
31532 次 |
| 最近记录: |