cc 3 tygodni temu
rodzic
commit
2c6bd2a5d9

+ 1 - 4
ai-server/src/main/java/com/zsjz/ai/common/config/DuckdbUnpooledDataSource.java

@@ -2,7 +2,6 @@
 package com.zsjz.ai.common.config;
 
 import cn.hutool.core.convert.Convert;
-import io.modelcontextprotocol.util.Utils;
 import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -54,13 +53,11 @@ public class DuckdbUnpooledDataSource implements DataSource, Closeable {
         configureDuckDB();
     }
 
-    public DuckdbUnpooledDataSource(String url, String username, String password, String driver) {
+    public DuckdbUnpooledDataSource(String url, String driver) {
         if (StringUtils.isEmpty(url)) {
             throw new IllegalArgumentException("Invalid ds url parameter");
         }
         this.url = url;
-        this.username = username;
-        this.password = password;
         setDriver(driver);
         this.duckDBConnection = (DuckDBConnection) createDuckDBInstance();
         configureDuckDB();

+ 2 - 2
ai-server/src/main/java/com/zsjz/ai/common/constants/StrConsts.java

@@ -4,8 +4,8 @@ import com.zsjz.ai.common.utils.StateManager;
 
 public class StrConsts {
     public static final String CACHE_TAG_QING_JIAN = "qing_jian";
-    public static final String DS_KEY_PLAT = "plat";
-    public static final String DS_KEY_CASE = "case";
+    public static final String DS_KEY_MASTER = "master";
+    public static final String DS_KEY_SLAVE = "slave";
     public static final String CACHE_GET_CALL_TABLE_NAME = "cache_getCallTableName";
     public static final String CACHE_GET_TRANS_TABLE_NAME = "cache_getTransTableName";
 

+ 7 - 2
ai-server/src/main/java/com/zsjz/ai/module/dm/clean/AbstractDataLoader.java

@@ -7,6 +7,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.duckdb.DuckDBAppender;
 import org.duckdb.DuckDBConnection;
 
+import javax.sql.DataSource;
+
+import static com.zsjz.ai.common.constants.StrConsts.DS_KEY_SLAVE;
+
 @Slf4j
 public abstract class AbstractDataLoader<S, T extends Cleaned> implements DataLoader<S, T> {
     protected DuckDBConnection duckDBConnection;
@@ -16,8 +20,9 @@ public abstract class AbstractDataLoader<S, T extends Cleaned> implements DataLo
     public AbstractDataLoader(String tableName) {
         this.tableName = tableName;
         try {
-            DynamicRoutingDataSource ds = SpringUtil.getBean(DynamicRoutingDataSource.class);
-            duckDBConnection = (DuckDBConnection) ds.getConnection();
+            DynamicRoutingDataSource ds = (DynamicRoutingDataSource) SpringUtil.getBean(DataSource.class);
+            DataSource slave = ds.getDataSource(DS_KEY_SLAVE);
+            duckDBConnection = (DuckDBConnection) slave.getConnection();
             duckDBAppender = duckDBConnection.createAppender(DuckDBConnection.DEFAULT_SCHEMA, tableName);
             log.info("初始化 DuckDB 数据加载器成功, tableName={}", tableName);
         } catch (Exception e) {

+ 13 - 11
ai-server/src/main/java/com/zsjz/ai/module/plat/service/CaseInfoService.java

@@ -7,6 +7,7 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
 import com.baomidou.mybatisplus.spring.service.impl.ServiceImpl;
 import com.zsjz.ai.common.cache.CaseDataCache;
+import com.zsjz.ai.common.config.DuckdbUnpooledDataSource;
 import com.zsjz.ai.common.constants.PathConst;
 import com.zsjz.ai.common.constants.StrConsts;
 import com.zsjz.ai.common.exception.ServerException;
@@ -16,9 +17,9 @@ import com.zsjz.ai.common.utils.LuceneManager;
 import com.zsjz.ai.common.utils.StateManager;
 import com.zsjz.ai.module.plat.mapper.CaseInfoMapper;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import javax.sql.DataSource;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.time.LocalDateTime;
@@ -30,11 +31,14 @@ import java.time.LocalDateTime;
 @Service
 public class CaseInfoService extends ServiceImpl<CaseInfoMapper, CaseInfo> {
 
-    @Autowired
-    private DynamicRoutingDataSource dynamicDataSource;
+    private final DynamicRoutingDataSource dynamicDataSource;
 
-    @Autowired
-    private SseService sseService;
+    private final SseService sseService;
+
+    public CaseInfoService(DataSource dataSource, SseService sseService) {
+        this.dynamicDataSource = (DynamicRoutingDataSource) dataSource;
+        this.sseService = sseService;
+    }
 
     /**
      * 创建案件
@@ -145,7 +149,7 @@ public class CaseInfoService extends ServiceImpl<CaseInfoMapper, CaseInfo> {
     private void closeOldDb() {
         try {
             LuceneManager.close();
-            dynamicDataSource.removeDataSource(StrConsts.DS_KEY_CASE);
+            dynamicDataSource.removeDataSource(StrConsts.DS_KEY_SLAVE);
             CaseDataCache.cleanCache();
             sseService.closeSee();
         } catch (Exception e) {
@@ -155,11 +159,9 @@ public class CaseInfoService extends ServiceImpl<CaseInfoMapper, CaseInfo> {
     }
 
     private void openNewDb(String dbPath) {
-        //Props props = Solon.cfg().getProp("qingjian.db1.case");
-        //props.setProperty("url", "jdbc:duckdb:" + dbPath);
-        //DataSource dataSource = DsUtils.buildDs(props);
-        //dynamicDataSource.setDefaultTargetDataSource(dataSource);
-        //dynamicDataSource.addTargetDataSource(StrConsts.DS_KEY_CASE, dataSource);
+        // 创建新的 DuckDB 数据源并覆盖 slave
+        DuckdbUnpooledDataSource dataSource = new DuckdbUnpooledDataSource("jdbc:duckdb:" + dbPath, "org.duckdb.DuckDBDriver");
+        dynamicDataSource.addDataSource(StrConsts.DS_KEY_SLAVE, dataSource);
     }
 
     public void exit() {

+ 1 - 1
ai-server/src/main/resources/application-dev.yaml

@@ -12,7 +12,7 @@ spring:
       strict: false
       datasource:
         master:
-          url: jdbc:postgresql://192.168.0.109:5432/etl-2
+          url: jdbc:postgresql://192.168.0.109:5432/zsjz-ai
           username: postgres
           password: postgres
           driver-class-name: org.postgresql.Driver