java.lang.StackOverflowErrorjava.lang.StackOverflowError
at java.lang.String.startsWith(String.java:1403)
at java.lang.String.startsWith(String.java:1434)
at org.springframework.beans.factory.BeanFactoryUtils.transformedBeanName(BeanFactoryUtils.java:83)
at org.springframework.beans.factory.support.AbstractBeanFactory.transformedBeanName(AbstractBeanFactory.java:1133)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:242)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
at org.springframework.aop.config.SimpleBeanFactoryAwareAspectInstanceFactory.getAspectInstance(SimpleBeanFactoryAwareAspectInstanceFactory.java:68)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at cn.itcast.utils.ConnectionUtils$$EnhancerBySpringCGLIB$$df902d8d.getThreadLocalConnection(<generated>)
at cn.itcast.utils.TransactionManager.release(TransactionManager.java:50)
at cn.itcast.utils.TransactionManager.aroundTx(TransactionManager.java:69)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
at cn.itcast.utils.ConnectionUtils$$EnhancerBySpringCGLIB$$df902d8d.getThreadLocalConnection(<generated>)
at cn.itcast.utils.TransactionManager.begin(TransactionManager.java:21)
at cn.itcast.utils.TransactionManager.aroundTx(TransactionManager.java:61)
at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
在调用String.startsWith函数时出现堆栈溢出,很可能是这个string有问题,具体看代码吧
栈溢出异常啊,原因有很多,需要具体分析
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
@Override
public void transfer(String outName, String inName, Double money) {
try {
accountDao.outMoney(outName,money);
//int a =1/0;
accountDao.inMoney(inName,money);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public List findAll() {
return accountDao.findAll();
}
}
@Repository
public class AccountDaoImpl implements AccountDao {
@Autowired
private QueryRunner queryRunner;
@Autowired
private ConnectionUtils connectionUtils;
@Override
public void outMoney(String outName, Double money) {
String sql = "update account set money = money-? where name = ?";
try {
queryRunner.update(connectionUtils.getThreadLocalConnection(),sql,money,outName);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public void inMoney(String inName, Double money) {
String sql = "update account set money = money+? where name = ?";
try {
queryRunner.update(connectionUtils.getThreadLocalConnection(),sql,money,inName);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public List findAll() {
String sql = "select * from account";
try {
return queryRunner.query(sql,new BeanListHandler<>(AccountDao.class));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
@Component
public class ConnectionUtils {
@Autowired
private DataSource dataSource;
private static final ThreadLocal<Connection> TL = new ThreadLocal<Connection>();
// 从TL中获取链接
public Connection getThreadLocalConnection(){
Connection connection = TL.get(); //从threadLocal中获取练级
if(connection==null){ //如果没有 需要重新向TL中存放一个
// 从DataSource中获取后放到TL
try {
connection = dataSource.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
TL.set(connection);
}
return connection;
}
// 把练级从TL从移除,如果不移除 TL中中的内容会越来越多 以至于会造成堆内存溢出
public void removeConnectionFromThreadLocal(){
TL.remove();
}
}
@Component //交给IOC
public class TransactionManager {
@Autowired
private ConnectionUtils connectionUtils;
//1、开启事务
public void begin(){
try {
// Connection connection = connectionUtils.getThreadLocalConnection(); //从TL 中获取一个连接
// connection.setAutoCommit(false); //把事务改成手动提交
connectionUtils.getThreadLocalConnection().setAutoCommit(false);
}catch (Exception e){
e.printStackTrace();
}
}
// 2、提交事务
public void commit(){
try {
connectionUtils.getThreadLocalConnection().commit();
}catch (Exception e){
e.printStackTrace();
}
}
// 3、事务回滚
public void rollback(){
try {
connectionUtils.getThreadLocalConnection().rollback();
}catch (Exception e){
e.printStackTrace();
}
}
//4、事务资源释放
public void release(){
try {
Connection connection = connectionUtils.getThreadLocalConnection();
connection.setAutoCommit(true); //改回成自动提交
connection.close(); //关闭connection
connectionUtils.removeConnectionFromThreadLocal(); //从TL中移除connection
}catch (Exception e){
e.printStackTrace();
}
}
public void aroundTx(ProceedingJoinPoint pjp){
try {
begin();
pjp.proceed();
commit();
} catch (Throwable throwable) {
throwable.printStackTrace();
System.out.println("...");
rollback();
} finally {
release();
}
}
}
applicationContext.xml配置: <context:component-scan base-package="cn.itcast"/> <!-- 加载项目以及jar中的配置文件--> <context:property-placeholder location="classpath:jdbc.properties"/> <!-- druid的数据源交给了ioc--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}"/> </bean> <!-- queryRunner交给了ioc--> <bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner"> <constructor-arg name="ds" ref="dataSource"/> </bean> <aop:config> <aop:aspect ref="transactionManager"> <aop:around method="aroundTx" pointcut="execution(* cn.itcast..*.*(..))"/> </aop:aspect> </aop:config>
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632