org.springframework.batch.item.ReaderNotOpenException:阅读器必须先打开才能读取

2024-02-14

我正在使用 Spring Batch 来运行(从数据库表读取并写入另一个表)作业

该作业是由 Quartz 调度的,数据库是 oracle,它是 c3p0,我遇到了 reader not open 异常

这是工作背景

<batch:job id="readyReqPoolJob">
    <batch:step id="readyReqPoolStep">
        <batch:tasklet>
            <batch:chunk reader="readyReqPoolReader" writer="readyReqPoolWrtiter"
                commit-interval="1000" />
        </batch:tasklet>
    </batch:step>
</batch:job>


<!-- ======================================================= -->
<!-- 6) READER -->
<!-- ======================================================= -->
<bean id="readyReqPoolReader"
    class="org.springframework.batch.item.database.JdbcCursorItemReader">
    <property name="dataSource" ref="dataSource" />
    <property name="sql" value="select * from SF_ILA_Ready_Request_Pool" />
    <property name="rowMapper" ref="ReadyReqPoolRowMapper" />
</bean>
<bean id="readyReqPoolWrtiter"
    class="com.mobily.housekeepingservice.readyrequestpoolarchive.ReadyReqPoolArchiveWriter" />


<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass"
        value="org.springframework.batch.sample.quartz.JobLauncherDetails" />
    <property name="jobDataAsMap">
        <map>
            <entry key="jobName" value="readyReqPoolJob" />
            <entry key="jobLocator" value-ref="jobRegistry" />
            <entry key="jobLauncher" value-ref="jobLauncher" />
        </map>
    </property>
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <bean id="cronTrigger"
            class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="jobDetail" />
            <property name="cronExpression" value="0 0/5 * * * ?" />
        </bean>
    </property>
</bean>

主要背景是:

<import resource="classpath:spring/batch/config/readyReqPoolContext.xml" />
<import resource="classpath:spring/batch/config/jdbc.commons.xml" />

<bean id="transactionManager"
            class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="dataSource" />
        </bean>
        <tx:annotation-driven transaction-manager="transactionManager" />
        <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
            <property name="dataSource" ref="dataSource" />
        </bean>

        <bean
            class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
            <property name="jobRegistry" ref="jobRegistry" />
        </bean>

        <bean id="jobRegistry"
            class="org.springframework.batch.core.configuration.support.MapJobRegistry" />


        <bean id="jobRepository"
            class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
            <property name="transactionManager" ref="transactionManager" />
        </bean>

        <!-- 4) LAUNCH JOBS FROM A REPOSITORY -->
        <bean id="jobLauncher"
            class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
            <property name="jobRepository" ref="jobRepository" />
        <property name="taskExecutor" ref="taskExecutor" />
    </bean>
    <bean id="taskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor" />

例外是:

09:59:20,108  INFO ClassPathXmlApplicationContext:510 - Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@99436c6: startup date [Sun Mar 02 09:59:20 AST 2014]; root of context hierarchy
09:59:20,159  INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [spring/batch/config/mainContext.xml]
09:59:20,285  INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [spring/batch/config/readyReqPoolContext.xml]
09:59:20,379  INFO DefaultListableBeanFactory:663 - Overriding bean definition for bean 'readyReqPoolJob': replacing [Generic bean: class [org.springframework.batch.core.configuration.xml.SimpleFlowFactoryBean]; scope=; abstract=false; lazyInit=false
; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null] with [Generic bean: class [org.springframework.batch.core.configuration.xml.JobPars
erJobFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]
09:59:20,383  INFO XmlBeanDefinitionReader:315 - Loading XML bean definitions from class path resource [spring/batch/config/jdbc.commons.xml]
09:59:20,744  INFO ClassPathXmlApplicationContext:1374 - Bean 'jobRegistry' of type [class org.springframework.batch.core.configuration.support.MapJobRegistry] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible
 for auto-proxying)
09:59:20,759  INFO ClassPathXmlApplicationContext:1374 - Bean 'org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0' of type [class org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] is not e
ligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
09:59:20,761  INFO ClassPathXmlApplicationContext:1374 - Bean 'org.springframework.transaction.config.internalTransactionAdvisor' of type [class org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor] is not eligible
 for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
09:59:20,778  INFO DefaultListableBeanFactory:596 - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@53ddc692: defining beans [org.springframework.batch.core.scope.internalStepScope,org.springframew
ork.beans.factory.config.CustomEditorConfigurer,org.springframework.batch.core.configuration.xml.CoreNamespacePostProcessor,readyReqPoolStep,readyReqPoolJob,readyReqPoolReader,readyReqPoolWrtiter,jobDetail,org.springframework.scheduling.quartz.Schedu
lerFactoryBean#0,dataSource,appJobExecutionListener,exceptionLogArchiveDAOImp,ExceptionLogRowMapper,exceptionLogWriter,itemFailureLoggerListener,log4jDebugArchiveDAOImp,log4jDebugArchiveWriter,Log4jDebugRowMapper,log4jErrorArchiveDAOImp,log4jErrorArc
hiveWriter,Log4jErrorRowMapper,log4jFatalArchiveDAOImp,log4jFatalArchiveWriter,Log4jFatalRowMapper,log4jInfoArchiveDAOImp,log4jInfoArchiveWriter,Log4jInfoRowMapper,log4jTraceArchiveDAOImp,log4jTraceArchiveWriter,Log4jTraceRowMapper,log4jWarnArchiveDA
OImp,log4jWarnArchiveWriter,Log4jWarnRowMapper,readyReqPoolArchiveDAOImp,readyReqPoolArchiveWriter,ReadyReqPoolRowMapper,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAu
towiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,transactionManager,org.springframework.aop.config.internalAutoProxyCreator,
org.springframework.transaction.annotation.AnnotationTransactionAttributeSource#0,org.springframework.transaction.interceptor.TransactionInterceptor#0,org.springframework.transaction.config.internalTransactionAdvisor,jdbcTemplate,org.springframework.
batch.core.configuration.support.JobRegistryBeanPostProcessor#0,jobRegistry,jobRepository,jobLauncher,taskExecutor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor]; root of factory hierarchy
09:59:20,812  INFO MLog:80 - MLog clients using log4j logging.
09:59:20,911  INFO C3P0Registry:204 - Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10]
09:59:21.296 [main] INFO  org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
09:59:21.312 [main] INFO  o.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
09:59:21.314 [main] INFO  org.quartz.core.QuartzScheduler - Quartz Scheduler v.1.8.6 created.
09:59:21.315 [main] INFO  org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
09:59:21.315 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v1.8.6) 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

09:59:21.316 [main] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' initialized from an externally provided properties instance.
09:59:21.316 [main] INFO  org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 1.8.6
09:59:21.317 [main] INFO  org.quartz.core.QuartzScheduler - JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@1fe0d622
09:59:21,491  INFO DefaultLifecycleProcessor:334 - Starting beans in phase 2147483647
09:59:21,491  INFO SchedulerFactoryBean:648 - Starting Quartz Scheduler now
09:59:21.491 [main] INFO  org.quartz.core.QuartzScheduler - Scheduler org.springframework.scheduling.quartz.SchedulerFactoryBean#0_$_NON_CLUSTERED started.
09:59:21,532  INFO AbstractPoolBackedDataSource:462 - Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 1, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -
> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 2rzno590zyfq8arapgjr|2022d1f4, debugUnreturnedCon
nectionStackTraces -> false, description -> null, driverClass -> oracle.jdbc.driver.OracleDriver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 2rzno590zyfq8arapgjr|2022d1f4, idleConnectionTestPeriod -> 10
000, initialPoolSize -> 4, jdbcUrl -> jdbc:oracle:thin:@10.14.11.186:1522:EMADEV, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 0, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 12, maxStatements -> 0, maxStatementsPerConne
ction -> 0, minPoolSize -> 8, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> SELECT 1 FROM DUAL, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnect
ionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
Exit Status : STARTING
Done
09:59:22,170  INFO SimpleJobLauncher:132 - Job: [FlowJob: [name=readyReqPoolJob]] launched with the following parameters: [{time=1393743561493}]
09:59:22,272  INFO SimpleStepHandler:135 - Executing step: [readyReqPoolStep]
09:59:22.314 [Timer-0] DEBUG org.quartz.utils.UpdateChecker - Checking for available updated version of Quartz...
10:00:00.011 [org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-1] DEBUG org.quartz.core.JobRunShell - Calling execute on job DEFAULT.jobDetail
10:00:00,017  INFO JobLauncherDetails:69 - Quartz trigger firing with Spring Batch jobName=readyReqPoolJob
10:00:00,051  INFO SimpleJobLauncher:132 - Job: [FlowJob: [name=readyReqPoolJob]] launched with the following parameters: [{}]
10:00:00,104  INFO SimpleStepHandler:135 - Executing step: [readyReqPoolStep]
10:00:00,112 ERROR AbstractStep:222 - Encountered an error executing the step
org.springframework.batch.item.ItemStreamException: Failed to initialize the reader
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:142)
    at org.springframework.batch.item.support.CompositeItemStream.open(CompositeItemStream.java:96)
    at org.springframework.batch.core.step.tasklet.TaskletStep.open(TaskletStep.java:306)
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:192)
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:137)
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:152)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:131)
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134)
    at java.lang.Thread.run(Thread.java:744)
Caused by: java.lang.IllegalStateException: Stream is already initialized.  Close before re-opening.
    at org.springframework.util.Assert.state(Assert.java:385)
    at org.springframework.batch.item.database.AbstractCursorItemReader.doOpen(AbstractCursorItemReader.java:399)
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:139)
    ... 12 more
10:00:00,145  INFO SimpleJobLauncher:135 - Job: [FlowJob: [name=readyReqPoolJob]] completed with the following parameters: [{}] and the following status: [FAILED]
10:00:04,963 ERROR AbstractStep:222 - Encountered an error executing the step
org.springframework.batch.item.ReaderNotOpenException: Reader must be open before it can be read.
    at org.springframework.batch.item.database.AbstractCursorItemReader.doRead(AbstractCursorItemReader.java:440)
    at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:83)
    at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91)
    at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:155)
    at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:114)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:108)
    at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:69)
    at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:395)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
    at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:267)
    at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:77)
    at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:368)
    at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:215)
    at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:144)
    at org.springframework.batch.core.step.tasklet.TaskletStep.doExecute(TaskletStep.java:253)
    at org.springframework.batch.core.step.AbstractStep.execute(AbstractStep.java:195)
    at org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:137)
    at org.springframework.batch.core.job.flow.JobFlowExecutor.executeStep(JobFlowExecutor.java:64)
    at org.springframework.batch.core.job.flow.support.state.StepState.handle(StepState.java:60)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.resume(SimpleFlow.java:152)
    at org.springframework.batch.core.job.flow.support.SimpleFlow.start(SimpleFlow.java:131)
    at org.springframework.batch.core.job.flow.FlowJob.doExecute(FlowJob.java:135)
    at org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:301)
    at org.springframework.batch.core.launch.support.SimpleJobLauncher$1.run(SimpleJobLauncher.java:134)
    at java.lang.Thread.run(Thread.java:744)
10:00:04,999  INFO SimpleJobLauncher:135 - Job: [FlowJob: [name=readyReqPoolJob]] completed with the following parameters: [{time=1393743561493}] and the following status: [FAILED]

这里的问题是你的读者是单例范围的。这意味着当作业第一次运行时,ItemReader 成功打开并且作业运行。但是,当作业尝试第二次运行时,它使用的是第一次运行的相同实例,该实例已经初始化(因此出现异常)。我建议将readyReqPoolReader更改为步骤范围的bean,看看是否有帮助。

您可以在此处阅读有关步骤范围的更多信息:http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/scope/StepScope.html http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/core/scope/StepScope.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

org.springframework.batch.item.ReaderNotOpenException:阅读器必须先打开才能读取 的相关文章

随机推荐

  • xvfb(带有 Mesa 19.2)与 Vulkan 兼容吗?

    我正在尝试在无头 Ubuntu 19 10 虚拟机上运行基于 Vulkan 的图形应用程序 通过xvfb https en wikipedia org wiki Xvfb 从裸露的 Ubuntu 19 10 映像开始 使用创建lxc htt
  • 摆脱 NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE?

    我越来越NP NULL ON SOME PATH FROM RETURN VALUE在这个片段中 final Integer id Ints tryParse idString FailReason NO SUCH THING checkC
  • 协方差胜过具体类型?

    老实说 我问过 这个问题的一部分 here https stackoverflow com questions 9335278 covariance in different fw causes code break但现在我有一个不同的相关
  • 避免在数据表中呈现“表中没有可用数据”

    我正在使用 JQuery 数据表 当表格呈现时 它显示为 表格中没有可用数据 一段时间后表格开始显示数据 并且 没有可用数据 消失 我不希望出现 没有可用数据 相反 如果出现 正在加载 或 请稍候 之类的内容 那就太好了 或者没有任何东西可
  • 当鼠标离开JQuery时停止.hover动画

    我有类似的东西 test hover function this animate function this animate 但如果用户的鼠标在动画结束之前离开 动画将继续 如果我快速重复地快速悬停和取消悬停元素 则动画会在鼠标离开元素后重
  • 从 3 个点检索正角或负角

    我正在围绕二维空间中的中心点旋转点 这些点是中心点 旧鼠标位置和新鼠标位置 我的旋转功能运行良好 我可以完美地计算角度 但如果用户沿应解释为逆时针方向移动鼠标 我想计算负角度 例如 如果您位于 小于 中心点的 y 值之上 小于 则向右 正
  • window、window.top 和 window.parent 之间有什么区别?

    我刚刚注意到top window and parent变量给了我相同的值 我正在 gmail 收件箱页面对此进行测试 有人知道这三个值有什么区别吗 如果您在框架内 window指当前帧 parent指的是当前框架的父级 top指最外层框架
  • 元音子序列

    我在准备面试时在网站上发现了这个问题 字符串的神奇子序列S是一个子序列S那 按顺序包含所有五个元音 查找字符串的最大神奇子序列的长度S 例如 如果S aeeiooua then aeiou and aeeioou是神奇的子序列 但aeio
  • 将 TIMESTAMP 列更新为可为空

    我有一个表存在于两个数据库中 在一个数据库中有一个表 其中有一列称为ROW VERSION这是类型TIMESTAMP NOT NULL 在第二个数据库中 同一个表具有相同类型的列TIMESTAMP但它是类型TIMESTAMP NULL 我想
  • 活动图 定时事件

    我正在尝试建模以下内容 填写提交表单时 系统每 5 分钟自动保存一次用户进度 这是我尝试过的 但我认为这是不正确的 就我而言 仅在 填写提交 活动完成后才会询问条件 另外 我不想表明用户正在再次开始 填写提交 活动 您将使用由虚线框表示的可
  • 具有多个连接的 ActiveRecord 查询无法识别关系

    我正在尝试编写一个 ActiveRecord 查询 使用以下查询返回注册特定课程的所有学生 def self students enrolled in course id Student joins enrollments joins se
  • .net 控制台应用程序 32 位与 64 位

    NET 中的应用程序是否需要构建为 64 位才能充分利用具有 64 位操作系统的计算机 或者它是否会像 32 位构建一样利用它 基本上 我们遇到了内存不足异常的问题 建议在 64 位机器上运行控制台应用程序 这 可能 解决该问题 问题是我们
  • 使用 Spring Security + Spring data + MongoDB 进行身份验证

    我想将 Spring security 与 MongoDB 结合使用 使用 Spring 数据 并从我自己的数据库中检索用户以实现 spring security 但是 我不能这样做 因为我的用户服务类型似乎不受支持 这是我的 UserSe
  • pip (python2) 和 pip3 (python3) 可以共存吗?

    我一直认为 pip 适用于 Python 2 pip3 适用于 Python 3 为了安装不同版本的 pip 我执行了以下操作 sudo apt get install python pip sudo apt get install pyt
  • PHP json_decode 有单引号问题,但没有双引号问题

    通过示例最容易解释 var dump json decode a b c d e f NULL var dump json decode a b c d e f array 3 0 gt object stdClass 1 1 a gt s
  • 如何在svg中动态设置坐标点

    我正在尝试使用 SVG 创建一个三角形 我这样做是按照tutorial http tutorials jenkov com svg polygon element html 但问题是坐标是硬编码的 在画布中 我通过从 javascript
  • 成员表达式无法从可为空的十进制转换为对象

    我正在开发一个 MVC 项目 并希望向 Html TextboxFor 方法传递属性名称 这是我的视图模型 public class RuleViewModel
  • AngularJS - 调用 Flickr API 失败并显示警告消息

    我有一个简单的 AngularJS 应用程序 允许用户搜索 Flickr 照片 问题出在 IE 中 当我调用 Flickr API 时 我收到以下消息 此页面正在访问不受其控制的信息 这会带来安全风险 你想继续吗 如果我单击 是 应用程序就
  • 如何在不使用 TableViewController 的情况下创建分组 TableView

    我有一个 UITableView 我希望它有 2 个部分 我现在知道 如果您使用 UITableViewController 并且使用静态单元格 则只能拥有分组部分 而我都不是 我想做的可能吗 如果是这样 我可以在哪里寻求设置方面的帮助 似
  • org.springframework.batch.item.ReaderNotOpenException:阅读器必须先打开才能读取

    我正在使用 Spring Batch 来运行 从数据库表读取并写入另一个表 作业 该作业是由 Quartz 调度的 数据库是 oracle 它是 c3p0 我遇到了 reader not open 异常 这是工作背景