imaging123 2015-11-14 11:04 采纳率: 25%
浏览 2191
已结题

查询数据库浏览器报出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
  • 写回答

2条回答 默认 最新

  • threenewbee 2015-11-14 11:22
    关注

    stackoverflow说明无限递归了。比如说你的表关联了外键,而外键又包含这个记录。这种情况,你需要用懒惰加载。

    评论

报告相同问题?

悬赏问题

  • ¥15 CSS实现渐隐虚线边框
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题