Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 石英在负载下抛出死锁_Hibernate_Spring_Quartz Scheduler - Fatal编程技术网

Hibernate 石英在负载下抛出死锁

Hibernate 石英在负载下抛出死锁,hibernate,spring,quartz-scheduler,Hibernate,Spring,Quartz Scheduler,我们使用带Spring的Quartz,当Quartz配置了多个线程时,我们的配置会抛出死锁。我开始相信这是因为我们没有用Spring正确地配置quartz,但是我找不到足够的文档来说明如何配置这两个组件以使其更好地发挥作用 我们同时在Windows和Linux环境下运行—指向MSSQL和Oracle DBs。对于这两个操作系统,使用任何一个数据库,我们都可以抛出以下死锁错误 我们一直在抛出这些死锁错误。我们在重载下运行,在几分钟内插入数百个石英触发器 2010-03-17 18:52:31,73

我们使用带Spring的Quartz,当Quartz配置了多个线程时,我们的配置会抛出死锁。我开始相信这是因为我们没有用Spring正确地配置quartz,但是我找不到足够的文档来说明如何配置这两个组件以使其更好地发挥作用

我们同时在Windows和Linux环境下运行—指向MSSQL和Oracle DBs。对于这两个操作系统,使用任何一个数据库,我们都可以抛出以下死锁错误

我们一直在抛出这些死锁错误。我们在重载下运行,在几分钟内插入数百个石英触发器

2010-03-17 18:52:31,737 [] [] ERROR [DFScheduler_Worker-42] core.ErrorLogger core.ErrorLogger (QuartzScheduler.java:2185) - An error occured while marking executed job complete. job= 'BPM.6e41a6567f0000020100362a51dc7a50'

org.quartz.JobPersistenceException: Couldn't remove trigger: Transaction (Process ID 87) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction. [See nested exception: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 87) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.removeTrigger(JobStoreSupport.java:1469)at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggeredJobComplete(JobStoreSupport.java:2978)at org.quartz.impl.jdbcjobstore.JobStoreSupport$39.execute(JobStoreSupport.java:2962) at org.quartz.impl.jdbcjobstore.JobStoreSupport$41.execute(JobStoreSupport.java:3713)at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3747)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3709)at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggeredJobComplete(JobStoreSupport.java:2958)at org.quartz.core.QuartzScheduler.notifyJobStoreJobComplete(QuartzScheduler.java:1727)at org.quartz.core.JobRunShell.run(JobRunShell.java:273)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 87) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(Unknown Source) at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source) at 
...
org.quartz.impl.jdbcjobstore.StdJDBCDelegate.deleteSimpleTrigger(StdJDBCDelegate.java:1820) at org.quartz.impl.jdbcjobstore.JobStoreSupport.deleteTriggerAndChildren(JobStoreSupport.java:1345 at org.quartz.impl.jdbcjobstore.JobStoreSupport.removeTrigger(JobStoreSupport.java:1453 ... 9 more
这就是我的quartz.properties文件的外观:

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 50
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.useProperties = false
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.selectWithLockSQL = SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?

您是否使用SchedulerFactoryBean?文档是:它将完全消除对实际quartz.properties的需要,并且您可以在应用程序的其余部分中使用数据源。这有明显的优点(比如连接池中的可重用连接),至少对我来说,调试起来比较容易

下面是我在一个老项目中的一个片段:

<bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="quartzProperties"> <!--  quartz attributes, configurable -->
        <value>
            org.quartz.scheduler.rmi.export = false
            org.quartz.scheduler.rmi.proxy = false
            org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
            org.quartz.threadPool.threadCount = ${threadCount}
            org.quartz.threadPool.threadPriority = 5
            org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
            org.quartz.jobStore.useProperties = false
            org.quartz.jobStore.driverDelegateClass = ${driverDelegate}
            org.quartz.jobStore.tablePrefix = QRTZ_
            org.quartz.jobStore.isClustered = false
        </value>
    </property>
    <property name="autoStartup" value="false" /> 
    <property name="waitForJobsToCompleteOnShutdown" value="false" />
    <property name="dataSource" ref="dataSource" />
</bean>

org.quartz.scheduler.rmi.export=false
org.quartz.scheduler.rmi.proxy=false
org.quartz.threadPool.class=org.quartz.siml.SimpleThreadPool
org.quartz.threadPool.threadCount=${threadCount}
org.quartz.threadPool.threadPriority=5
org.quartz.threadPool.threadsinheritContextClassLoaderFinitializingThread=true
org.quartz.jobStore.useProperties=false
org.quartz.jobStore.driverDelegateClass=${driverDelegate}
org.quartz.jobStore.tablePrefix=QRTZ_
org.quartz.jobStore.isClustered=false
数据源通常是:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    ....
    <property name="validationQuery" value="SELECT 1" />
    <property name="testWhileIdle" value="true" />
    <property name="testOnBorrow" value="true" />
    <property name="testOnReturn" value="true" />
</bean>

....

显然,quartzProperties与文件中的类似,但我发现,一旦我从quarts.properties切换到Spring类,应用程序的一般行为会更好。实际上只有一个数据源访问数据库,这也很有帮助。

在没有看到您的配置的情况下,我们无法评论这可能是错误的,因为我们也在使用spring类。不过,我也会尝试您的配置。我注意到您没有配置非事务性数据源。为什么呢?我只是想把这一切都想清楚。有意思的问题。由于没有实际完成数据源设置,我无法回答这个问题。由于数据库查询的类型,包含这些代码片段的特定项目需要事务数据源,但其他项目使用相同的设置(每个项目一个事务数据源)。