最近因为工作需要 要做这样一个工作,要从一个数据库把里面4张表数据导入另外一个库中 来做报表分析,因为原来的生产环境使用人数比较多为了不影响使用才使用到处部分表的方式来做。
因为这几张表又很多数据就考虑了用java来做定时任务每天抽取前一天产生的数据。这样就需要一开始就把那边的数据全部导入到这边数据。
因为数据量比较大再配置数据源的时候使用了c3p0数据源
class="java" name="code">
maximum-connection-count=2000
maximumActiveTime=80000000 这个数据比较重要
simultaneous-build-throttle=150
minimum-connection-count=10
maximumActiveTime=80000000 为什么这里要设置那么大呢 因为在第一次抽取数据的时候数据量很大,一开始因为时间设置短在抽取到三分之一的时候就会出现连接关闭的
错误。所以这里可以根据数据情况设置大小
还有一个问题是在抽取的时候因为一次要把数据库里面的数据全部抽取到
内存里面 所以机器的内存要大,不够容易产生内存溢出的错误,接下来就要调整jvm的大小了,因为要把数据一次性读入到内存中如果不设置大的话就容易溢出。这里我使用了tomcat来启动我的应用 所以就要设置tomcat的jvm大小
-XmsXXXXm -XmxXXXXm
这里需要使用到64位的JDK因为要设置大的话32位JDK设置超过2G就会无法启动tomcat,所以应该选择64位JDK。
再抽取过程中还出现了 java.lang.OutOfMemoryError:GC overhead limit exceeded
异常 查询得知
DK6新增错误类型。当GC为释放很小空间占用大量时间时抛出。
一般是因为堆太小。导致异常的原因:没有足够的内存。
解决方法
1、查看系统是否有使用大内存的代码或死
循环。
2、可以添加
JVM的启动参数来
限制使用内存:-XX:-UseGCOverheadLimit
该文章主要是记录平时开发中所遇到的问题,望见谅写的比较粗糙,后期慢慢修改