问题描述
- 查询数据库浏览器报出500错误:stackOverFlowError
-
我在做mybatis+spring+shardbatis进行分库分表,当我查询所有记录时,在浏览器里报500错误,异常信息如下:
java.lang.StackOverflowError
java.util.concurrent.AbstractExecutorService.(AbstractExecutorService.java:71)
java.util.concurrent.ThreadPoolExecutor.(ThreadPoolExecutor.java:1302)
java.util.concurrent.ThreadPoolExecutor.(ThreadPoolExecutor.java:1195)
org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:116)
org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115)
org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:85)
org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:169)
org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDataSource(PooledConnection.java:223)
org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:179)
org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699)
org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633)
org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484)
org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:142)
org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115)
org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:85)
org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:169)
org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDataSource(PooledConnection.java:223)
org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:179)
org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699)
org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633)
org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484)
org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:142)
org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115)
org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:85)
org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:169)
org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDataSource(PooledConnection.java:223)
org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:179)
org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699)
org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:633)
org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:484)
org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:142)
org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:115)
org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:102)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:126)
org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:85)......(后面还有很多重复的);TestController.java里的内容如下:
@Autowired private TestService service; @RequestMapping("/query") public ModelAndView query() { ModelAndView mv = new ModelAndView(); List<Test> result = new ArrayList<Test>(); for(int i = 1;i<=4;i++) { Map<String, Object> param = ImmutableMap.<String, Object> of("a", i); List<Test> res = service.queryAll(param); result.addAll(res); } System.out.println(result); mv.addObject("tests",result); mv.setViewName("test"); return mv; }
TestMapper.java内容如下:
@DbShard(dbKey = "ds", rule = "$a$ % 2")//ds0,ds1(shard0,shard1) @TableShard(tablePattern = "test", rule = "leftPad($a$ % 4, 3)")//补足3位(000,001,002,003) @Repository public interface TestMapper { public void save(@DbShardWith(props = "a") @TableShardWith(props = "a") Test test); public List<Test> query(@DbShardWith(props = "a") @TableShardWith(props = "a") Map<String, Object> param); public void update(@DbShardWith(props = "a") @TableShardWith(props = "a") Map<String, Object> param); public List<Test> queryAll(@DbShardWith(props = "a") @TableShardWith(props = "a") Map<String, Object> param); }
jsp里没什么,index里有请求controller的跳转,test.jsp显示所有记录
PS:最后我想是不是与数据源的配置有关,但感觉又不是,因为在main函数里测试是好的(附上数据源),还有VM options我也设置了,也没用:
<!--设置数据源ds0,ds1--> <bean id="ds0" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="${jdbc.url0}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="maxActive" value="30"/> <property name="maxIdle" value="10"/> <property name="maxWait" value="6000"/> <property name="defaultAutoCommit" value="true"/> <property name="testOnBorrow" value="true"/> <property name="validationQuery" value="select 1"/> <property name="validationInterval" value="60000"/> </bean> <bean id="ds1" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="${jdbc.url1}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="maxActive" value="30"/> <property name="maxIdle" value="10"/> <property name="maxWait" value="6000"/> <property name="defaultAutoCommit" value="true"/> <property name="testOnBorrow" value="true"/> <property name="validationQuery" value="select 1"/> <property name="validationInterval" value="60000"/> </bean> <bean id="dataSource" class="org.lysu.shard.ds.ShardDataSource"> <property name="targetDataSources"> <map key-type="java.lang.String"> <entry key="ds_0" value-ref="ds0"/> <entry key="ds_1" value-ref="ds1"/> </map> </property> <property name="defaultTargetDataSource" ref="ds0"/> </bean>
vm options: -Xms256m -Xmx512m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
解决方案
stackoverflow说明无限递归了。比如说你的表关联了外键,而外键又包含这个记录。这种情况,你需要用懒惰加载。
解决方案二:
可能是…… ……
时间: 2024-08-31 14:36:39