使用 LocalDb 配置 Quartz 的 AdoJobStores
Configure AdoJobStores of Quartz with LocalDb
我已经将 Quartz AdoJobStores 与 SQL 服务器一起使用了很长时间,没有任何问题。最近我将 SQL 服务器数据库更改为 LocalDB 数据库并收到以下异常:
Quartz.JobPersistenceException: Couldn't obtain job names: Invalid object name 'QRTZ_JOB_DETAILS'.
System.Data.SqlClient.SqlException: Invalid object name 'QRTZ_JOB_DETAILS'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at Quartz.Impl.AdoJobStore.StdAdoDelegate.SelectJobsInGroup(ConnectionAndTransactionHolder conn, GroupMatcher`1 matcher)
at Quartz.Impl.AdoJobStore.JobStoreSupport.GetJobNames(ConnectionAndTransactionHolder conn, GroupMatcher`1 matcher)
这是我 App.config 上的 Quartz 配置部分:
<quartz>
<add key="quartz.scheduler.instanceName" value="RemoteServer" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz" />
<add key="quartz.scheduler.exporter.port" value="9999" />
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler" />
<add key="quartz.scheduler.exporter.channelType" value="tcp" />
<add key="quartz.scheduler.exporter.channelName" value="httpQuartz" />
<add key="quartz.scheduler.instanceId" value="instance_one" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.useProperties" value="true" />
<add key="quartz.jobStore.dataSource" value="default" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
<add key="quartz.dataSource.default.connectionString" value="Data Source=(localdb)\v11.0; Initial Catalog=Scheduling;MultipleActiveResultSets=true;Integrated Security=SSPI" />
<add key="quartz.dataSource.default.provider" value="SqlServer-20" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
数据库存在,我可以使用 Navicat 连接到它但它是空的,没有任何 table。我想也许我可以成为数据库提供者并阅读页面 Quartz.NET - Lesson 9: JobStores 我发现这些是可用的数据库提供者:
- SqlServer-20 - SQL Server driver for .NET Framework 2.0
- OracleODP-20 - Oracle's Oracle Driver
- OracleODPManaged-1123-40 Oracle's managed driver for Oracle 11
- OracleODPManaged-1211-40 Oracle's managed driver for Oracle 12
- MySql-50 - MySQL Connector/.NET v. 5.0 (.NET 2.0)
- MySql-51 - MySQL Connector/:NET v. 5.1 (.NET 2.0)
- MySql-65 - MySQL Connector/:NET v. 6.5 (.NET 2.0)
- SQLite-10 - SQLite ADO.NET 2.0 Provider v. 1.0.56 (.NET 2.0)
- Firebird-201 - Firebird ADO.NET 2.0 Provider v. 2.0.1 (.NET 2.0)
- Firebird-210 - Firebird ADO.NET 2.0 Provider v. 2.1.0 (.NET 2.0)
- Npgsql-20 - PostgreSQL Npgsql
问题
- 我可以将 LocalDB 数据库与 SQLServerDelegate 一起使用吗?
- 出现问题是因为 Quartz 没有 LocalDB 的提供程序?
如果您通过 SSMS (Sql Server Management Studio) 连接到“(localdb)\v11.0”...您可以创建一个新的数据库(例如 QuartzDB)。然后 运行 创建它的脚本。
我通过此 google 搜索找到了脚本
https://www.google.com/search?q=%22CREATE+TABLE+%5Bdbo%5D.%5BQRTZ_CALENDARS%5D%22
这是我找到的一个:
https://raw.githubusercontent.com/quartznet/quartznet/master/database/tables/tables_sqlServer.sql
或这个:
https://github.com/quartznet/quartznet/blob/main/database/tables/tables_sqlServer.sql
我认为您可以使用 SqlServer-20 针对该数据库使用石英库。请注意,并非每个版本的 sql-server 都存在一个提供程序,'SqlServer-20' 以“最小公分母”类型的方式适用于 sql-server 的多个版本.
我认为最重要的是...石英库不创建 tables/DDL,它使用已经创建的 DDL。
我已经将 Quartz AdoJobStores 与 SQL 服务器一起使用了很长时间,没有任何问题。最近我将 SQL 服务器数据库更改为 LocalDB 数据库并收到以下异常:
Quartz.JobPersistenceException: Couldn't obtain job names: Invalid object name 'QRTZ_JOB_DETAILS'.
System.Data.SqlClient.SqlException: Invalid object name 'QRTZ_JOB_DETAILS'.
at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction)
at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj, Boolean& dataReady)
at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
at System.Data.SqlClient.SqlDataReader.get_MetaData()
at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite)
at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
at Quartz.Impl.AdoJobStore.StdAdoDelegate.SelectJobsInGroup(ConnectionAndTransactionHolder conn, GroupMatcher`1 matcher)
at Quartz.Impl.AdoJobStore.JobStoreSupport.GetJobNames(ConnectionAndTransactionHolder conn, GroupMatcher`1 matcher)
这是我 App.config 上的 Quartz 配置部分:
<quartz>
<add key="quartz.scheduler.instanceName" value="RemoteServer" />
<add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
<add key="quartz.threadPool.threadCount" value="10" />
<add key="quartz.threadPool.threadPriority" value="Normal" />
<add key="quartz.scheduler.exporter.type" value="Quartz.Simpl.RemotingSchedulerExporter, Quartz" />
<add key="quartz.scheduler.exporter.port" value="9999" />
<add key="quartz.scheduler.exporter.bindName" value="QuartzScheduler" />
<add key="quartz.scheduler.exporter.channelType" value="tcp" />
<add key="quartz.scheduler.exporter.channelName" value="httpQuartz" />
<add key="quartz.scheduler.instanceId" value="instance_one" />
<add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
<add key="quartz.jobStore.useProperties" value="true" />
<add key="quartz.jobStore.dataSource" value="default" />
<add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
<add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" />
<add key="quartz.dataSource.default.connectionString" value="Data Source=(localdb)\v11.0; Initial Catalog=Scheduling;MultipleActiveResultSets=true;Integrated Security=SSPI" />
<add key="quartz.dataSource.default.provider" value="SqlServer-20" />
<add key="quartz.jobStore.misfireThreshold" value="60000" />
数据库存在,我可以使用 Navicat 连接到它但它是空的,没有任何 table。我想也许我可以成为数据库提供者并阅读页面 Quartz.NET - Lesson 9: JobStores 我发现这些是可用的数据库提供者:
- SqlServer-20 - SQL Server driver for .NET Framework 2.0
- OracleODP-20 - Oracle's Oracle Driver
- OracleODPManaged-1123-40 Oracle's managed driver for Oracle 11
- OracleODPManaged-1211-40 Oracle's managed driver for Oracle 12
- MySql-50 - MySQL Connector/.NET v. 5.0 (.NET 2.0)
- MySql-51 - MySQL Connector/:NET v. 5.1 (.NET 2.0)
- MySql-65 - MySQL Connector/:NET v. 6.5 (.NET 2.0)
- SQLite-10 - SQLite ADO.NET 2.0 Provider v. 1.0.56 (.NET 2.0)
- Firebird-201 - Firebird ADO.NET 2.0 Provider v. 2.0.1 (.NET 2.0)
- Firebird-210 - Firebird ADO.NET 2.0 Provider v. 2.1.0 (.NET 2.0)
- Npgsql-20 - PostgreSQL Npgsql
问题
- 我可以将 LocalDB 数据库与 SQLServerDelegate 一起使用吗?
- 出现问题是因为 Quartz 没有 LocalDB 的提供程序?
如果您通过 SSMS (Sql Server Management Studio) 连接到“(localdb)\v11.0”...您可以创建一个新的数据库(例如 QuartzDB)。然后 运行 创建它的脚本。
我通过此 google 搜索找到了脚本
https://www.google.com/search?q=%22CREATE+TABLE+%5Bdbo%5D.%5BQRTZ_CALENDARS%5D%22
这是我找到的一个:
https://raw.githubusercontent.com/quartznet/quartznet/master/database/tables/tables_sqlServer.sql
或这个:
https://github.com/quartznet/quartznet/blob/main/database/tables/tables_sqlServer.sql
我认为您可以使用 SqlServer-20 针对该数据库使用石英库。请注意,并非每个版本的 sql-server 都存在一个提供程序,'SqlServer-20' 以“最小公分母”类型的方式适用于 sql-server 的多个版本.
我认为最重要的是...石英库不创建 tables/DDL,它使用已经创建的 DDL。