问题1:Java中如何循环删除一个集合(如List)中的多个元素
集合删除元素时,集合的size会变小,连带索引都会改变!
- ArrayList<Integer> a=new ArrayList<Integer>(15);
- a.add(222);
- a.add(3);
- a.add(333);
- a.add(000);
- a.add(333);
- a.add(4);
- for(int s=a.size()-1;s>=0;s--){
- if(a.get(s).intValue()==333){
- a.remove(s);
- }
- }
方法二:使用Iterator的remove()方法删除集合中的元素
查看JDK手册的Iterator接口,看到它还有一个remove方法。 remove void remove()
从迭代器指向的 collection 中移除迭代器返回的最后一个元素(可选操作)。每次调用 next 只能调用一次此方法。如果进行迭代时用调用此方法之外的其他方式修改了该迭代器所指向的 collection,则迭代器的行为是不确定的。抛出:UnsupportedOperationException - 如果迭代器不支持 remove 操作。IllegalStateException - 如果尚未调用 next 方法,或者在上一次调用 next 方法之后已经调用了 remove 方法。
- privatevoid screenBlackNameList(List<SharedBoardSmsWrapper> source, List<BlackNameListModel> blackNameList){
- Iterator<SharedBoardSmsWrapper> sourceIt=source.iterator();
- while(sourceIt.hasNext()){
- SharedBoardSmsWrapper tmpSharedBoardSmsWrapper=sourceIt.next();
- Iterator<BlackNameListModel> blackNameListIt=blackNameList.iterator();
- while(blackNameListIt.hasNext()){
- BlackNameListModel tmpBlackNameListModel=blackNameListIt.next();
- if(tmpSharedBoardSmsWrapper.getSource().equals(tmpBlackNameListModel.getSource())){
- sourceIt.remove();
- break;
- }
- }
- <span style="white-space:pre"> </span>}
- }
可以看到,Iterator删除了元素,并且把游标重新置为正确的位子。只要没有其他线程同时改变该集合,就不会有任何问题。
- public String preAuditedRepliesTask() {
- try {
- //根据任务Id查出回复任务
- this.repliesTask = this.repliesTaskService .getRepliesTaskById(repliesTask.getTaskId());
- //查出任务下的详细任务列表
- detailList = this.repliesTaskService .getRepliesTaskDetailListById(repliesTask.getTaskId(),1);
- for(int j=detailList.size()-1;detailList !=null&&j>=0;j--){
- if(detailList .get(j).getRepliesAuthor() == null || detailList.get(j).getRepliesAuthor().equals("" )){
- detailList.remove (detailList .get(j));
- }
- }
- List<RepliesTaskDetail> repliesTaskDetail = new ArrayList<RepliesTaskDetail>();
- repliesTaskDetail = this.repliesTaskService .getRepliesTaskDetailListById(repliesTask.getTaskId(),1);
- //查出自动审核中该任务下的未通过的任务 只要查出该主任务ID下的回帖ID为空的即可; 将回帖ID为空的详细任务列表添加到list集合中
- for(int k=0;detailList!=null &&k<repliesTaskDetail.size();k++){
- if(repliesTaskDetail.get(k).getRepliesAuthor() == null || repliesTaskDetail.get(k).getRepliesAuthor().equals("" )){
- notPassDetailList.add(repliesTaskDetail.get(k));
- }
- }
- return "replies_preAuditedTask" ;
- } catch (Exception e) {
- this.msg [0] = "加载处理回帖任务页面出错!" + e.toString();
- msg[1] = "replies-getBeAuditedRepliesTaskList.gxad" ;
- return "error" ;
- }
- }
有的时候需要在页面上进行计算,比如要显示十条数据并且十条数据前要有显示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>
加大缓冲区的容量,进入 MySQL 的安装目录,打开 my.ini ,增加或修改以下配置项:
在进入到imageUp.jsp中
//修正显示时候的地址数据,如果后台返回的是图片的绝对地址,那么此处无需修正
tmpObj.data_ue_src = tmpObj.src = ci.url;//原editor.options.imagePath + ci.url;
history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面
history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在
history.back(0) 刷新
history.back(1) 前进
history.back(-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:
问题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
- com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory
- com.atomikos.icatch.console_file_name=atomikos_tagspider_console_file
- com.atomikos.icatch.log_base_name=atomikos_tagspider_log_base
- com.atomikos.icatch.tm_unique_name=atomikos_tagspider_tm_unique
- com.atomikos.icatch.console_log_level=warn
- com.atomikos.icatch.max_actives=100
我们在最后面加了两句话:
- com.atomikos.icatch.default_jta_timeout=10000
- com.atomikos.icatch.max_timeout=20000000
- <property name="reapTimeout" value="20000" /> value变为20000
- <!-- 利用atomicos配置数据源对象1 -->
- <bean id="dataSource8" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" init-method="init" destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="${datasource8.url}" />
- <property name="user" value="${datasource8.username}" />
- <property name="password" value="${datasource8.password}" />
- <property name="uniqueResourceName" value="NONXADBMS-sid8" />
- <property name="poolSize" value="10" />
- <property name="minPoolSize" value="10" />
- <property name="maxPoolSize" value="30" />
- <property name="borrowConnectionTimeout" value="60" />
- <property name="reapTimeout" value="20000" />
- <!-- 最大空闲时间 -->
- <property name="maxIdleTime" value="120" />
- <property name="maintenanceInterval" value="60" />
- <property name="loginTimeout" value="60" />
- <property name="logWriter" value="60" />
- <property name="testQuery">
- <value>select 1</value>
- </property>
- </bean>
- <!-- 利用atomicos配置数据源对象2 -->
- <bean id="dataSource9" class="com.atomikos.jdbc.nonxa.AtomikosNonXADataSourceBean" init-method="init" destroy-method="close">
- <property name="driverClassName" value="com.mysql.jdbc.Driver" />
- <property name="url" value="${datasource9.url}" />
- <property name="user" value="${datasource9.username}" />
- <property name="password" value="${datasource9.password}" />
- <property name="uniqueResourceName" value="NONXADBMS-sid9" />
- <property name="poolSize" value="10" />
- <property name="minPoolSize" value="10" />
- <property name="maxPoolSize" value="30" />
- <property name="borrowConnectionTimeout" value="60" />
- <property name="reapTimeout" value="20000" />
- <!-- 最大空闲时间 -->
- <property name="maxIdleTime" value="120" />
- <property name="maintenanceInterval" value="60" />
- <property name="loginTimeout" value="60" />
- <property name="logWriter" value="60" />
- <property name="testQuery">
- <value>select 1</value>
- </property>
- </bean>
reapTimeout 是管理 Connection 被占用的时间.
如果不设置这个值,Atomikos使用默认的5分钟,那么在处理大批量数据读取的时候,一旦超过5分钟,就会抛出类似 Resultset is close 的错误.
这里附上一篇很类似的文章,备忘: 另一篇解决方案,看了下,配置和我类似 点击打开链接
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
com.atomikos.icatch.log_base_dir=/usr/app/logs