Java问题集锦

问题1:Java中如何循环删除一个集合(如List)中的多个元素


集合删除元素时,集合的size会变小,连带索引都会改变!

方法一:用传统for循环,从集合最后元素向前循环删除元素,集合的size会变小,连带索引都会改变,但不会影响到前面的未循环元素。

[java]  view plain copy 在CODE上查看代码片
  1. ArrayList<Integer> a=new ArrayList<Integer>(15);  
  2.     a.add(222);  
  3.     a.add(3);  
  4.     a.add(333);  
  5.     a.add(000);  
  6.     a.add(333);  
  7.     a.add(4);  
  8. for(int s=a.size()-1;s>=0;s--){  
  9.     if(a.get(s).intValue()==333){  
  10.      a.remove(s);  
  11.     }  
  12. }  

方法二:使用Iterator的remove()方法删除集合中的元素

  查看JDK手册的Iterator接口,看到它还有一个remove方法。 remove   void remove()

  从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。抛出:UnsupportedOperationException - 如果迭代器不支持 remove 操作。IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。

[java]  view plain copy
  1. privatevoid screenBlackNameList(List<SharedBoardSmsWrapper> source, List<BlackNameListModel> blackNameList){    
  2. Iterator<SharedBoardSmsWrapper> sourceIt=source.iterator();    
  3. while(sourceIt.hasNext()){    
  4.     SharedBoardSmsWrapper tmpSharedBoardSmsWrapper=sourceIt.next();    
  5.     Iterator<BlackNameListModel> blackNameListIt=blackNameList.iterator();    
  6.     while(blackNameListIt.hasNext()){    
  7.         BlackNameListModel tmpBlackNameListModel=blackNameListIt.next();    
  8.        if(tmpSharedBoardSmsWrapper.getSource().equals(tmpBlackNameListModel.getSource())){    
  9.            sourceIt.remove();    
  10.            break;    
  11.         }    
  12.     }    
  13. <span style="white-space:pre">    </span>}    
  14. }  

可以看到,Iterator删除了元素,并且把游标重新置为正确的位子。只要没有其他线程同时改变该集合,就不会有任何问题。


以下为实际项目中遇到问题:

当使用remove的时候,我直接使用的将arrayList中对象的回帖Id为空的对象一个一个的remove掉,出现的问题是,第八个对象的回帖ID为空,那么第八个被我删掉之后,第九个就变成了第八个,然后就会出现错的数据,不该出现的却出现了,使用倒叙可以解决这个问题;

[java]  view plain copy
  1. public String preAuditedRepliesTask() {  
  2.              try {  
  3.                    //根据任务Id查出回复任务  
  4.                    this.repliesTask = this.repliesTaskService .getRepliesTaskById(repliesTask.getTaskId());  
  5.                    //查出任务下的详细任务列表  
  6.                     
  7.                    detailList = this.repliesTaskService .getRepliesTaskDetailListById(repliesTask.getTaskId(),1);  
  8.                     
  9.                    for(int j=detailList.size()-1;detailList !=null&&j>=0;j--){  
  10.                          if(detailList .get(j).getRepliesAuthor() == null || detailList.get(j).getRepliesAuthor().equals("" )){  
  11.                                detailList.remove (detailList .get(j));  
  12.                         }       
  13.                 }  
  14.                     
  15.                     
  16.                   List<RepliesTaskDetail>  repliesTaskDetail = new ArrayList<RepliesTaskDetail>();  
  17.                   repliesTaskDetail = this.repliesTaskService .getRepliesTaskDetailListById(repliesTask.getTaskId(),1);  
  18.                    //查出自动审核中该任务下的未通过的任务  只要查出该主任务ID下的回帖ID为空的即可; 将回帖ID为空的详细任务列表添加到list集合中  
  19.                    for(int k=0;detailList!=null &&k<repliesTaskDetail.size();k++){  
  20.                                if(repliesTaskDetail.get(k).getRepliesAuthor() == null || repliesTaskDetail.get(k).getRepliesAuthor().equals("" )){  
  21.                                      notPassDetailList.add(repliesTaskDetail.get(k));  
  22.                               }       
  23.                       }  
  24.                    return "replies_preAuditedTask" ;  
  25.             } catch (Exception e) {  
  26.                    this.msg [0] = "加载处理回帖任务页面出错!" + e.toString();  
  27.                    msg[1] = "replies-getBeAuditedRepliesTaskList.gxad" ;  
  28.                    return "error" ;  
  29.             }  
  30.       }  

问题2: 在Hibernate中,我们在书写SQL语句,也就是使用SQLQuery查询的时候最好不要使用到:(冒号),这是一个bug,hibernate无法识别;


当上面的方式不能执行后,我们选择了另一种方式来查找我的排行,也就是我在所有用户中的积分排名;



问题3:

使用myelcipse发现输入控制台,会直接称乱码,按照网上的各种方式改了都没用,最后参照一篇文章好了,原来是将操作系统语言改成了英文,导致了这个问题;改正后就好了;

在控制面板,地区和语言中将英文改成中文就好了,英文操作系统默认是使用的英文;
Properties pro=System.getProperties();
            System. out.println(pro.getProperty("file.encoding" ));

可以打印这个语句看看系统使用的语言是什么;


问题4:

递归查询一个表;  比如说想查某一个部门下下的所有用户,那么我们就要查询1下的所有部门,所有部门下如果还有子部门,那么我们还要查询子部门下的子部门,然后查询部门下的用户;
两个核心方法如下:

通过部门ID查询所有子部门信息departmentList拿到了所有的部门实体,然后我们通过部门实体将所有的用户信息查询出来即可:

然后在后台组织类似  In ids(1,2,3,4); 这种写法;

在我们获取id集合的时候,可能会出现一个问题,也就是我们取出的集合使用逗号来拼接的时候,最后的一个逗号该如何去掉,


DAO层方法:



问题5:

字符串太长无法显示全部,那么在页面上我们改如何控制呢?
首先,你必须用<s:set >将获取的字符串存到一变量里面,以str属性为例
直接获取<s:set name="str" value="parameters.str[0]"></s:set>
从集合中获取时:<s:iterator value="集合" >
.........................
<s:set name="str" value="str"></s:set>
.........................
</s:iterator>然后就是判断截取
// 当长度超过6时截取前6为显示
<s:if test="%{#str.length()>6}">
<s:property value="str.substring(0,6)+'...'" />
</s:if>
//否则全部显示
<s:else>
<s:property value="str" />
</s:else>


问题6: 使用struts2给页面显示数据前加上序号:

有的时候需要在页面上进行计算,比如要显示十条数据并且十条数据前要有显示123456……的序号,解决这个问题有两种办法。第一种是通过set标签实现:

<s:set name="a" value=1/>

<s:iterator value="list" status="index">
     <s:property value="#a"/>

     <s:set name="a" value="#a+1"/>
</s:iterator>

第二种办法就是通过iterator的索引来实现:

<s:iterator value="list" status="index">
     <s:property value="#index.index"/>
</s:iterator>



问题7. 当使用mysql导入blob字段类型数据或者插入大量数据类型时候回报mysqlserver has gone away;

加大缓冲区的容量,进入 MySQL 的安装目录,打开 my.ini ,增加或修改以下配置项:

 max_allowed_packet=50M 
值的大小取决于数据的多少,修改后需要重启数据库。


问题8 : 当我们在页面上使用隐含域,如果两个隐含域的表单名称相同,我们在CMS系统中的(credits-user-list.jsp) 页面上试验的是,本身有一个s:input隐含域,然后我们自己又写了一个,导致每次后台取值都在本身的值前面加了一个,或者后面加了一个;
 

问题9: 通过百度富文本编辑器ueditor,将图片和各种表情符号存入到数据库中,然后我们想在页面上原样输出(中途试过用textToHtml,转义,麻烦且无效):
< s:property value= "mediaReportData.mediaReport.reportContent" escapeHtml ="false"/>    直接在标签后加上escapeHtml =“false”即可;struts2支持;




当使用ueditor文本编辑器时,遇到一个问题,本地传图一直失败,原来是struts2拦截的原因,解决方法如下,struts.xml中加入:

<  constant  name =  "struts.action.excludePattern"  value = "/common/.*"  />



struts2 ueditor 上传图片获取不到值

在进入到imageUp.jsp中

FileItemIterator fii = sfu.getItemIterator(request);

解析request 请求,并返回FileItemIterator集合,但是没有从集

合中获得一个文件流,就没有进while(fii.hasNext()) 执行

fii.hasNext()是flash。

什么原因呢。说是struts封装了request。

所以这里要让struts过滤掉这个jsp页面。

在struts.xml加入(也我的ueditor文件夹在commponents里

面,所以直接过滤了这个整个文件夹)

<constant name="struts.action.excludePattern" value="/components/.*" />

另外ueditor返回成功上传的图片完整路径的话,但是点确定

文本框在前面多加了ueditor的文件路径,直接修改
commponents/ueditor/dialogs/image/image.js
//修正显示时候的地址数据,如果后台返回的是图片的绝对地址,那么此处无需修正
tmpObj.data_ue_src = tmpObj.src = ci.url;//原editor.options.imagePath + ci.url;


问题10:
当我们从数据库中查出数据的时候,如果一个列表可以通过一个sql查询出来,那么最好,但是列表中如果包含权限,比如说运营专员登录,客户专员登录,

下图中红色框为一句sql查询出来的,中间蓝色为一句sql,由于需要使用分页,如果单纯的将两个list相加,然后再将它们的tatalrows相加,那么会出问题,分页出不来,我们在加分页的时候,只能横向加,也就是在每一行的后面加,而不是加行数;



在微信墙二期中,当得知两个lsit拼到一起,然后分页会出问题后,我是将两个红色框一起查询出一个pageInfo,然后循环pageInfo.getItems();这样就可以拿到客户管理列表中的客户ID,然后通过客户ID查询每个客户相关活动状态的数量,然后将数量加到整个大的Vo中,也就是客户的Vo,然后显示到页面上;这样既不影响分页,也可以将列表上所有的数据查全,如果不区分权限,其实可以用一个sql查询出来;如下:




但是区分了权限之后,处理变的复杂,管理员,运营专员,客户专员,代理商各有一套,并且下拉中也得写一套 ,最原始的我是在sql中处理的,四个角色四个sql,在sqlmap中使用<if test="">分割sql语句,但那样不灵活,并且容易出错,后来采用在后台写逻辑,因为是要查所有的客户(包含代理商,在线申请客户,直接客户),所以我们只需要将所有的id组织好,然后统一使用select * from client A where A.deleteFlag = 0 and A.clientId in (); 就行了:


问题11:

使用ajax生成列表,如果我们将js单独提取出来,或者将页面上的权限代码等页面代码写到js中时,不会生效,这时候我们

可以在js中将所要用到的东西传过来,然后在html中写少量js;




并且这些js代码要在js文件代码之 ,js运行代码是有顺序的;




问题12:

history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面

history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在

history.back(0) 刷新
history.back(1) 前进
history.back(-1) 后退
问题13:
当我们使用 
[html]  view plain copy
  1. <button type="button" class="btn r" onclick = "submitForm();"> </button>  

如果不加type="button" 那么默认为input type="submit" ,所以我在使用验证框架的时候即使出现错误信息,弹出提示框,还是默认提交了表单,这时候我们只需要将按钮类型改为button就行了,如果使用<input type="submit" /> 这个一个道理;
 
    
问题14:当我们在页面上使用对象.对象.对象传值,也就是对象.的方式传值;我们在后台定义的condition为

如果这个时候提示类型转换异常等的时候,可以将这些对象都初始化一下;
比如:





问题14.当我们定义实体类中的java bean的时候,我们需要都定义成对象类型,不然系统会默认给这些值,比如你是int类型,那么前台组织好查询条件后,
系统在后台会默认给这些值为0,那么就不是我们想要的结果,我们在定义javabean的时候应该定义为对象类型,比如:
private Integer msgNum; 这样如果我们没赋值,默认传一个空过去,后台组织条件,如果为空,就不会组织这个条件了,而不是默认赋值0;
问题15:
今天遇到个问题,用js提交表单报错。

错误信息: 
chrome报的错误信息:Uncaught TypeError: Property 'submit' of object # is not a function
firefox报的错误信息:TypeError: e[h] is not a function 

错误原因:在表单中有个button的name叫"submit" 

解决办法:直接砍掉button的name属性。


问题16:
JTA事务中,经常出现org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: com.atomikos.jdbc.AtomikosSQLException: Attempt to use connection after it was closed.
具体错误如下图:
 fansId = 417604262 OR fansId = 417578556 OR fansId = 417604263 OR fansId = 417604261 OR fansId = 417604264 OR fansId = 417604265 OR fansId = 417604266 OR fansId = 417604459 OR fansId = 417604460 OR fansId = 417604461 OR fansId = 417604462 OR fansId = 417604604 OR fansId = 417604605 OR fansId = 417604606 OR fansId = 417604607 OR fansId = 417604608 OR fansId = 417604753 OR fansId = 417604754 OR fansId = 417604805 OR fansId = 417604806 OR fansId = 417604807 OR fansId = 417604839 OR fansId = 417342067 OR fansId = 417604887 OR fansId = 417604968 OR fansId = 417604969 OR fansId = 417604970 OR fansId = 417605115 OR fansId = 417600292 OR fansId = 417600292 OR fansId = 417605115 OR fansId = 416730437 OR fansId = 417605116 OR fansId = 417605117 OR fansId = 417605118 OR fansId = 417605119 OR fansId = 417605120 OR fansId = 417605042 OR fansId = 417605121 OR fansId = 417605367 OR fansId = 417605368 OR fansId = 417605369 OR fansId = 417605366 OR fansId = 417605370 OR fansId = 417605371 OR fansId = 417605497 OR fansId = 417577367 OR fansId = 417605498 OR fansId = 417605499 OR fansId = 417166563 OR fansId = 417605500 OR fansId = 417605646 OR fansId = 417605647 OR fansId = 417605648 OR fansId = 417605649 OR fansId = 417605650 OR fansId = 417605776 OR fansId = 417605777 OR fansId = 417605852 OR fansId = 417605853 OR fansId = 417605904 OR fansId = 417606023 OR fansId = 417606024 OR fansId = 417581713 OR fansId = 417604261 OR fansId = 417246481 OR fansId = 417246481 OR fansId = 417605114 OR fansId = 417605365 OR fansId = 417605496 OR fansId = 417605644 OR fansId = 417605645 OR fansId = 417605775 OR fansId = 417605744 OR fansId = 417605744 OR fansId = 417604603 OR fansId = 417605114 OR fansId = 417450837 OR fansId = 417605364 OR fansId = 417605365 OR fansId = 417605366 OR fansId = 417605495 OR fansId = 417605496 OR fansId = 417580960 OR fansId = 417605643 OR fansId = 417605644 OR fansId = 417605645 OR fansId = 417585850 OR fansId = 417605775 OR fansId = 417605744 OR fansId = 417605744 OR fansId = 417605993
org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: com.atomikos.jdbc.AtomikosSQLException: Attempt to use connection after it was closed.
### The error may exist in com/guoxin/module/weibo/dao/mappers/PostSearchsMapper.xml
### The error may involve com.guoxin.module.weibo.dao.IPostSearchsDao.getPostSearchsById
### The error occurred while executing a query
### SQL: SELECT * FROM post_searchs WHERE searchId = ?
### Cause: com.atomikos.jdbc.AtomikosSQLException: Attempt to use connection after it was closed.
; uncategorized SQLException for SQL []; SQL state [null]; error code [0]; Attempt to use connection after it was closed.; nested exception is com.atomikos.jdbc.AtomikosSQLException: Attempt to use connection after it was closed.
       at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
       at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
       at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
       at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
       at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)
       at $Proxy7.selectOne(Unknown Source)
       at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:159)
       at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:63)
       at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
       at $Proxy34.getPostSearchsById(Unknown Source)
       at com.guoxin.module.weibo.service.impl.PostSearchsService.saveAll(PostSearchsService.java:111)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:597)
       at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
       at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
       at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
       at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
       at $Proxy35.saveAll(Unknown Source)
       at com.guoxin.module.weibo.action.Test2.testGetTime(Test2.java:99)
       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:597)
       at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
       at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
       at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
       at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
       at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
       at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
       at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
       at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
       at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
       at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
       at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
       at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
       at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
       at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: com.atomikos.jdbc.AtomikosSQLException: Attempt to use connection after it was closed.
       at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:19)
       at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:30)
       at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.invoke(AtomikosThreadLocalConnection.java:219)
       at $Proxy6.prepareStatement(Unknown Source)
       at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:72)
       at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:82)
       at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:54)
       at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:70)
       at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:56)
       at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:259)
       at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:132)
       at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)
       at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)
       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
       at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:62)
       at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
       at java.lang.reflect.Method.invoke(Method.java:597)
       at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354)
       ... 42 more

之前的JTA.properties为:
[html]  view plain copy
  1.   
[html]  view plain copy
  1. com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory  
  2. com.atomikos.icatch.console_file_name=atomikos_tagspider_console_file  
  3. com.atomikos.icatch.log_base_name=atomikos_tagspider_log_base  
  4. com.atomikos.icatch.tm_unique_name=atomikos_tagspider_tm_unique  
  5. com.atomikos.icatch.console_log_level=warn  
  6. com.atomikos.icatch.max_actives=100  


我们在最后面加了两句话:

[html]  view plain copy
  1. com.atomikos.icatch.default_jta_timeout=10000  
  2. com.atomikos.icatch.max_timeout=20000000  


然后我们在spring_base.xml中改变了一些参数:将我们配置的每个数据源的
[html]  view plain copy
  1. <property name="reapTimeout" value="20000" />  value变为20000    

[html]  view plain copy
  1. <!-- 利用atomicos配置数据源对象1 -->  
  2.     <bean id="dataSource8" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" init-method="init" destroy-method="close">  
  3.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  4.         <property name="url" value="${datasource8.url}" />  
  5.         <property name="user" value="${datasource8.username}" />  
  6.         <property name="password" value="${datasource8.password}" />  
  7.         <property name="uniqueResourceName" value="NONXADBMS-sid8" />  
  8.         <property name="poolSize" value="10" />  
  9.         <property name="minPoolSize" value="10" />  
  10.         <property name="maxPoolSize" value="30" />  
  11.         <property name="borrowConnectionTimeout" value="60" />   
  12.         <property name="reapTimeout" value="20000" />  
  13.         <!-- 最大空闲时间 -->   
  14.         <property name="maxIdleTime" value="120" />  
  15.         <property name="maintenanceInterval" value="60" />   
  16.         <property name="loginTimeout" value="60" />   
  17.         <property name="logWriter" value="60" />   
  18.         <property name="testQuery">          
  19.             <value>select 1</value>         
  20.         </property>  
  21.     </bean>  
  22.       
  23.     <!-- 利用atomicos配置数据源对象2 -->  
  24.     <bean id="dataSource9" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" init-method="init" destroy-method="close">  
  25.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  26.         <property name="url" value="${datasource9.url}" />  
  27.         <property name="user" value="${datasource9.username}" />  
  28.         <property name="password" value="${datasource9.password}" />  
  29.         <property name="uniqueResourceName" value="NONXADBMS-sid9" />  
  30.         <property name="poolSize" value="10" />  
  31.         <property name="minPoolSize" value="10" />  
  32.         <property name="maxPoolSize" value="30" />  
  33.         <property name="borrowConnectionTimeout" value="60" />   
  34.         <property name="reapTimeout" value="20000" />  
  35.         <!-- 最大空闲时间 -->   
  36.         <property name="maxIdleTime" value="120" />  
  37.         <property name="maintenanceInterval" value="60" />   
  38.         <property name="loginTimeout" value="60" />   
  39.         <property name="logWriter" value="60" />   
  40.         <property name="testQuery">          
  41.             <value>select 1</value>         
  42.         </property>  
  43.     </bean>  
这里我们之前的插入更新操作等等都是使用的单条操作,如果数据很多,那么会超过事务时间,这时候就会报错之类,这里可以采取批量操作,监测系统使用的是mybatis,我们可以采取批量操作,比如每条insert into 不如同时insert into多条数据;

 reapTimeout 是管理 Connection 被占用的时间.

如果不设置这个值,Atomikos使用默认的5分钟,那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误.


这里附上一篇很类似的文章,备忘: 另一篇解决方案,看了下,配置和我类似   点击打开链接


问题15: 数据库链接断开,mysql数据库在八个小时内没有访问的话,再次链接会显示断开,这个为转评系统的问题,这里我们使用一个定时器,每个小时查询一次wbmt数据库,这个问题就小时了;防止数据库链接断开;
Last packet sent to the server was 516511 ms ago.
2014-07-25 09:31:17 168  WARN atomikos:78 - Failed to reset original autoCommit state: Communications link failure

Last packet sent to the server was 516514 ms ago.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 516514 ms ago.
	at sun.reflect.GeneratedConstructorAccessor89.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
	at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
	at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3246)
	at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1917)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)
	at com.mysql.jdbc.ConnectionImpl.setAutoCommit(ConnectionImpl.java:4874)
	at com.atomikos.jdbc.nonxa.AtomikosThreadLocalConnection.transactionTerminated(AtomikosThreadLocalConnection.java:360)
	at com.atomikos.jdbc.nonxa.AtomikosNonXAParticipant.rollback(AtomikosNonXAParticipant.java:131)
	at com.atomikos.icatch.imp.RollbackMessage.send(RollbackMessage.java:90)
	at com.atomikos.icatch.imp.PropagationMessage.submit(PropagationMessage.java:86)
	at com.atomikos.icatch.imp.Propagator$PropagatorThread.run(Propagator.java:62)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.net.SocketException: Broken pipe
	at java.net.SocketOutputStream.socketWrite0(Native Method)
	at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
	at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
	at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
	at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
	at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3227)
	... 12 more

 jta中配置输出日志文件路径 :
JTA.properties
 com.atomikos.icatch.output_dir=/usr/app/logs
com.atomikos.icatch.log_base_dir=/usr/app/logs 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值