DaoConfig调试出错

本文介绍了一种在使用MyBatis时遇到的Dao配置问题及其解决方案。问题出现在尝试加载DAO配置文件时,具体表现为找不到必要的类定义,文中详细记录了错误堆栈跟踪,并寻求帮助。

DaoConfig:

public class DaoConfig {
  
 public static DaoManager getDaoManagerInstance() {
  DaoManager daoManager = null;
  try {
   String resource ="com/jxgl/persistence/sqlmapdao/config/dao.xml";
   Reader reader = Resources.getResourceAsReader(resource);
   daoManager = DaoManagerBuilder.buildDaoManager(reader);
  } catch (IOException e) {
   throw new RuntimeException("未能初始化数据库--" + DaoConfig.class);
  }
  return daoManager;
 }
}

当我调试到:daoManager = DaoManagerBuilder.buildDaoManager(reader);的时候

就会出现错误!

Class File Editor
source not found

The source attachment does not contain the source for Class.class

错误信息:

ERROR - Servlet.service() for servlet default threw exception
java.lang.NoClassDefFoundError: com/ibatis/sqlmap/client/SqlMapClientBuilder
 at com.ibatis.dao.engine.transaction.sqlmap.SqlMapDaoTransactionManager.configure(SqlMapDaoTransactionManager.java:52)
 at com.ibatis.dao.engine.builder.xml.XmlDaoManagerBuilder.parseTransactionManager(XmlDaoManagerBuilder.java:193)
 at com.ibatis.dao.engine.builder.xml.XmlDaoManagerBuilder.parseContext(XmlDaoManagerBuilder.java:157)
 at com.ibatis.dao.engine.builder.xml.XmlDaoManagerBuilder.buildDaoManager(XmlDaoManagerBuilder.java:102)
 at com.ibatis.dao.client.DaoManagerBuilder.buildDaoManager(DaoManagerBuilder.java:59)
 at com.jxgl.persistence.sqlmapdao.config.DaoConfig.getDaoManagerInstance(DaoConfig.java:22)
 at com.jxgl.dbservice.XyxjService.<init>(XyxjService.java:16)
 at com.jxgl.delegate.XyxjDelegate.<init>(XyxjDelegate.java:16)
 at com.jxgl.struts2.action.XyxjManage.<init>(XyxjManage.java:27)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
 at java.lang.Class.newInstance0(Class.java:350)
 at java.lang.Class.newInstance(Class.java:303)
 at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:123)
 at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:154)
 at com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:143)
 at com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:113)
 at com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:275)
 at com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:365)
 at com.opensymphony.xwork2.DefaultActionInvocation.access$000(DefaultActionInvocation.java:38)
 at com.opensymphony.xwork2.DefaultActionInvocation$1.doProfiling(DefaultActionInvocation.java:83)
 at com.opensymphony.xwork2.util.profiling.UtilTimerStack.profile(UtilTimerStack.java:455)
 at com.opensymphony.xwork2.DefaultActionInvocation.<init>(DefaultActionInvocation.java:74)
 at com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:189)
 at org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:41)
 at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:494)
 at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:419)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
 at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
 at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
 at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
 at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
 at java.lang.Thread.run(Thread.java:595)

帮帮我吧   在此感激.

class TaskQueueManager : public QObject//负责管理队列的出队进队,管理插入、管理米数、管理换卷的时候需要做的额外的判断 { public: TaskQueueManager(QObject* parent = nullptr); ~TaskQueueManager(); void InitTaskQueueManager(); void EnqueueInsert(const DefectInfoItem& data); void EnqueueUpdateReel(const QSharedPointer<TaskStruct::UpDataByReelTask> task); void EnqueueUpdateMeter(const QSharedPointer<TaskStruct::UpDataByMeterTask> task); QSharedPointer<TaskStruct::DatabaseTaskBase> DequeueTask(); void StartTimers(); void StopTimers(); private slots: void OnInsertTimerTimeout(); void OnMeterTimerTimeout(); private: void FlushInsertQueue(); QString GeneratorTableName(DefectInfoItem& data); private: QQueue<QSharedPointer<TaskStruct::DatabaseTaskBase>> reelQueue; QMutex reelQueueMutex; QQueue<QSharedPointer<TaskStruct::DatabaseTaskBase>> otherQueue; QMutex otherQueueMutex; QQueue<DefectInfoItem>insertQueue;//插入队列 QMutex insertQueueMutex;//插入队列锁 //米数更新用的成员变量 CurrentRunData currentMeterData; QMutex meterDataMutex; bool meterDataDirty = false; QTimer* insertTimer;//插入定时器 QTimer* meterTimer;//米数更新定时器(米数不用接收到就马上执行,而是要等上50毫秒再执行) protected: Q_OBJECT }; TaskQueueManager::TaskQueueManager(QObject* parent) : QObject(parent) { } TaskQueueManager::~TaskQueueManager() { this->StopTimers(); { QMutexLocker locker(&this->insertQueueMutex); if (!this->insertQueue.isEmpty()) { FlushInsertQueue(); } } delete this->insertTimer; delete this->meterTimer; } void TaskQueueManager::InitTaskQueueManager() { qDebug() << QStringLiteral("TaskQueueManager线程:") << QThread::currentThreadId(); this->insertTimer = new QTimer(); this->insertTimer->setInterval(500); this->meterTimer = new QTimer(); this->meterTimer->setInterval(50); connect(this->insertTimer, &QTimer::timeout, this, &TaskQueueManager::OnInsertTimerTimeout); connect(this->meterTimer, &QTimer::timeout, this, &TaskQueueManager::OnMeterTimerTimeout); } void TaskQueueManager::EnqueueInsert(const DefectInfoItem& data) { qDebug() << QStringLiteral("EnqueueInsert线程:") << QThread::currentThreadId(); QMutexLocker locker(&this->insertQueueMutex); this->insertQueue.enqueue(data); qDebug() << this->insertQueue.size(); } void TaskQueueManager::EnqueueUpdateReel(const QSharedPointer<TaskStruct::UpDataByReelTask> task) { QMutexLocker locker(&this->reelQueueMutex); this->reelQueue.enqueue(task); } void TaskQueueManager::EnqueueUpdateMeter(const QSharedPointer<TaskStruct::UpDataByMeterTask> task) { QMutexLocker locker(&this->meterDataMutex); this->currentMeterData = task->currentRunData; this->meterDataDirty = true; } QSharedPointer<TaskStruct::DatabaseTaskBase> TaskQueueManager::DequeueTask() { qDebug() << "reelQueue" << this->reelQueue.size(); qDebug() << "otherQueue" << this->otherQueue.size(); qDebug() << QStringLiteral("DequeueTask线程:") << QThread::currentThreadId(); { QMutexLocker locker(&this->reelQueueMutex); if (!this->reelQueue.isEmpty()) { return this->reelQueue.dequeue(); } } { QMutexLocker locker(&this->otherQueueMutex); if (!this->otherQueue.isEmpty()) { return this->otherQueue.dequeue(); } } return nullptr; } void TaskQueueManager::StartTimers() { qDebug() << QStringLiteral("StartTimers线程:") << QThread::currentThreadId(); this->meterTimer->start(); this->insertTimer->start(); } void TaskQueueManager::StopTimers() { qDebug() << QStringLiteral("StopTimers线程:") << QThread::currentThreadId(); if (this->meterTimer && this->meterTimer->isActive()) { this->meterTimer->stop(); } if (this->insertTimer && this->insertTimer->isActive()) // 修复重复判断 { this->insertTimer->stop(); } } void TaskQueueManager::OnInsertTimerTimeout() { qDebug() << QStringLiteral("OnInsertTimerTimeout线程:") << QThread::currentThreadId(); QMutexLocker locker(&this->insertQueueMutex); if (!insertQueue.isEmpty()) { FlushInsertQueue(); } } void TaskQueueManager::FlushInsertQueue() { qDebug() << QStringLiteral("FlushInsertQueue线程:") << QThread::currentThreadId(); if (this->insertQueue.isEmpty()) { return; } QHash<QString, QQueue<DefectInfoItem>> l_groupedTasks; while (!this->insertQueue.isEmpty()) { auto l_defectInfoItem = this->insertQueue.dequeue(); QString l_tableName = this->GeneratorTableName(l_defectInfoItem); l_groupedTasks[l_tableName].enqueue(l_defectInfoItem); } for (auto it = l_groupedTasks.begin(); it != l_groupedTasks.end(); ++it) { auto l_batchTask = QSharedPointer<TaskStruct::BatchInsertTask>::create(); l_batchTask->defectItems = it.value(); l_batchTask->tableName = it.key(); { QMutexLocker locker(&this->otherQueueMutex); this->otherQueue.enqueue(l_batchTask); } } } QString TaskQueueManager::GeneratorTableName(DefectInfoItem& data) { QString l_timePart = data.startTime; QString l_tableName = "test_defect_table";//QString("reel_%1").arg(l_timePart.replace("-", "").replace(":", "").replace(" ", "").replace(".", "")); return l_tableName; } void TaskQueueManager::OnMeterTimerTimeout() { QSharedPointer<TaskStruct::UpDataByMeterTask> task; { QMutexLocker locker(&meterDataMutex); if (!this->meterDataDirty) { return; } task = QSharedPointer<TaskStruct::UpDataByMeterTask>::create(); task->currentRunData = currentMeterData; this->meterDataDirty = false; } QMutexLocker locker(&otherQueueMutex); this->otherQueue.enqueue(task); } class TaskWorker : public QObject { public: explicit TaskWorker(QObject* parent = nullptr); ~TaskWorker(); void InitTaskWorker(); bool DoInsertNgDataList(const QQueue<DefectInfoItem>& dataList, const QString& tableName); bool DoUpdateReel(CurrentRunData& data); bool DoUpdateMeter(CurrentRunData& data); bool IsDatabaseOpen(); bool OpenDataBaseConnect(); bool CloseConnection(); private: bool ExecuteCommand(QSqlQuery& query); QSqlDatabase taskDB; protected: Q_OBJECT }; TaskWorker::TaskWorker(QObject* parent) : QObject(parent) { } TaskWorker::~TaskWorker() { this->CloseConnection(); } void TaskWorker::InitTaskWorker() { qDebug() << QStringLiteral("InitTaskWorker线程:") << QThread::currentThreadId(); if (!OpenDataBaseConnect()) { qDebug() << QStringLiteral("数据库连接失败!"); } } bool TaskWorker::OpenDataBaseConnect() { ConfigManager* l_configInstance = ConfigManager::GetConfigInstance(); ConfigManager::DAOConfig* l_daoConfig = l_configInstance->GetConfig(); QString l_driverName; switch (l_daoConfig->type) { case ConfigManager::DataBaseType::SQLite: l_driverName = l_driverName = "QSQLITE"; break; case ConfigManager::DataBaseType::MySQL: l_driverName = l_driverName = "QMYSQL"; break; case ConfigManager::DataBaseType::PostgreSQL: l_driverName = l_driverName = "QPSQL"; break; case ConfigManager::DataBaseType::Oracle: l_driverName = l_driverName = "QOCI"; break; default: l_driverName = "QMYSQL"; } if (QSqlDatabase::contains("TaskConnection")) { this->taskDB = QSqlDatabase::database("TaskConnection"); if (this->taskDB.isOpen()) { this->taskDB.close(); } } else { this->taskDB = QSqlDatabase::addDatabase(l_driverName, "TaskConnection"); } if (l_daoConfig->type != ConfigManager::DataBaseType::SQLite) { this->taskDB.setHostName(l_daoConfig->host); this->taskDB.setPort(l_daoConfig->port); } taskDB.setDatabaseName(l_daoConfig->dbName); taskDB.setUserName(l_daoConfig->account); taskDB.setPassword(l_daoConfig->password); if (!taskDB.open()) { QSqlError l_error = taskDB.lastError(); //qDebug() << QStringLiteral("驱动错误:") << l_error.driverText(); //qDebug() << QStringLiteral("错误描述:") << l_error.text(); return false; } else { //qDebug() << QStringLiteral("数据库连接创建成功,线程ID:") << QThread::currentThreadId(); //qDebug() << QStringLiteral("子线程 数据库连接成功"); return true; } qDebug() << QStringLiteral("OpenDataBaseConnect线程:") << QThread::currentThreadId(); } class XZJDATABASE_EXPORT TaskProcessor : public QObject { public: TaskProcessor(QObject* parent = nullptr); ~TaskProcessor(); void InitTaskProcessor(); QSharedPointer<TaskQueueManager> GetTaskQueueManager(); public slots: void StartProcessing(); void StopProcessing(); public slots: void ProcessTask(); private: QSharedPointer<TaskQueueManager> queueManager; // 队列管理器 QSharedPointer<TaskWorker> worker; // 数据库操作实例 QMutex waitMutex; // 等待锁 QWaitCondition waitCondition; // 线程等待条件 std::atomic<bool> isRunning{ false }; // 运行状态 protected: Q_OBJECT }; TaskProcessor::TaskProcessor(QObject* parent) : QObject(parent) { } TaskProcessor::~TaskProcessor() { this->StopProcessing(); } void TaskProcessor::InitTaskProcessor() { qDebug() << QStringLiteral("InitTaskProcessor线程:") << QThread::currentThreadId(); this->queueManager = QSharedPointer<TaskQueueManager>::create(this); this->worker = QSharedPointer<TaskWorker>::create(this); this->queueManager->InitTaskQueueManager(); this->worker->InitTaskWorker(); } QSharedPointer<TaskQueueManager> TaskProcessor::GetTaskQueueManager() { return this->queueManager; } void TaskProcessor::StartProcessing() { this->isRunning = true; this->queueManager->StartTimers(); this->ProcessTask(); } void TaskProcessor::StopProcessing() { this->isRunning = false; this->waitCondition.wakeAll(); this->queueManager->StopTimers(); } void TaskProcessor::ProcessTask() { qDebug() << QStringLiteral("ProcessTask线程:") << QThread::currentThreadId(); while (this->isRunning) { qDebug() << QStringLiteral("ProcessTask 循环执行"); auto task = queueManager->DequeueTask(); if (!task) { qDebug() << "null data"; QMutexLocker locker(&waitMutex); waitCondition.wait(&waitMutex, 50); } else { switch (task->type) { case TaskStruct::TaskType::BatchInsert: { qDebug() << QStringLiteral("TaskStruct::TaskType::BatchInsert 批量插入"); auto bacthInsertTask = task.staticCast<TaskStruct::BatchInsertTask>(); bool success = this->worker->DoInsertNgDataList(bacthInsertTask->defectItems, bacthInsertTask->tableName); if (success) { LOG_INFO("Batch insert completed successfully."); qDebug() << "Batch insert completed successfully."; } else { LOG_ERROR("Batch insert failed."); qDebug() << "Batch insert failed."; } break; } case TaskStruct::TaskType::UpdateReel: { auto reelTask = task.staticCast<TaskStruct::UpDataByReelTask>(); bool success = this->worker->DoUpdateReel(reelTask->currentRunData); if (success) { LOG_INFO("Reel update completed."); } else { LOG_ERROR("Reel update failed."); } break; } case TaskStruct::TaskType::UpdateMeter: { auto meterTask = task.staticCast<TaskStruct::UpDataByMeterTask>(); bool success = this->worker->DoUpdateMeter(meterTask->currentRunData); if (success) { LOG_INFO("Meter update completed."); } else { LOG_ERROR("Meter update failed."); } break; } } } } } //可以选择缓存然后等初始化完成后通过OnThread中进行数据的再次添加 class XZJDATABASE_EXPORT TaskAccessService : public QObject { public: explicit TaskAccessService(QObject* parent = nullptr); ~TaskAccessService() override; void InitTaskAccessService(); void InsertNgData(const DefectInfoItem& data); void UpDateByChangeReel(const CurrentRunData& data); void UpdateByChangeMeter(const CurrentRunData& data); private: QSharedPointer<TaskProcessor> processor; QThread* workerThread; int testcount = 0; protected: Q_OBJECT }; TaskAccessService::TaskAccessService(QObject* parent) : QObject(parent) { } TaskAccessService::~TaskAccessService() { if (this->workerThread && this->workerThread->isRunning()) { this->processor->StopProcessing(); this->workerThread->quit(); this->workerThread->wait(1000); this->workerThread->terminate(); } delete this->workerThread; } void TaskAccessService::InitTaskAccessService() { qDebug() << QStringLiteral("InitTaskAccessService线程:") << QThread::currentThreadId(); this->workerThread = new QThread(); this->processor = QSharedPointer<TaskProcessor>::create(); this->processor->moveToThread(this->workerThread); this->processor->InitTaskProcessor(); connect(workerThread, &QThread::started, processor.data(), &TaskProcessor::StartProcessing); this->workerThread->start(); } void TaskAccessService::InsertNgData(const DefectInfoItem& data) { this->testcount++; this->processor->GetTaskQueueManager()->EnqueueInsert(data); qDebug() << this->testcount; } void TaskAccessService::UpDateByChangeReel(const CurrentRunData& data) { auto task = QSharedPointer<TaskStruct::UpDataByReelTask>::create(); task->currentRunData = data; this->processor->GetTaskQueueManager()->EnqueueUpdateReel(task); } void TaskAccessService::UpdateByChangeMeter(const CurrentRunData& data) { auto task = QSharedPointer<TaskStruct::UpDataByMeterTask>::create(); task->currentRunData = data; this->processor->GetTaskQueueManager()->EnqueueUpdateMeter(task); } void XZJDataBaseModel::Init() { QString configPath = PathManager::GetPathInstance()->GetConfigFilePath(); ConfigManager* l_configInstance = ConfigManager::GetConfigInstance(); l_configInstance->LoadJsonConfig(configPath); ConfigManager::DAOConfig* l_daoConfig = l_configInstance->GetConfig(); PrintRollProductionDAO* l_daoInstance = PrintRollProductionDAO::GetDAOInstance(); l_daoInstance->OpenDataBaseConnect(l_daoConfig->type, l_daoConfig->host, l_daoConfig->port, l_daoConfig->dbName, l_daoConfig->account, l_daoConfig->password); this->taskAccessService = QSharedPointer<TaskAccessService>::create(); this->taskAccessService->InitTaskAccessService(); //this->TestQuery(); this->TestInsert(); } 这些是我优化后的代码,请帮我分析下是否还有问题,以及insert流程能否走通,以及关于Processor中的ProcessTask函数是否有其他方法实现在不用定时器的情况下,以及Service中需要考虑子线程和主线程之间的顺序关系,比如子线程还未初始化,主线程就通过service进行调用接口,并且你不要通过一些比如在未初始化完全前就禁止调用接口的方式来解决这个问题。我的主线程目前就一个创建service对象、初始化service、然后开始调用对象中的函数,其他的你看下分别有哪些问题以及有哪些方法解决?
最新发布
07-24
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值