我们这有个多租户系统,每个租户的数据库连接信息存放在数据库中。
当某租户首次登录系统时,会将租户的数据连接启动起来,使用租户唯一编号作为连接的configName。
后续访问就先检查数据连接是否存在,存在就不重复启动数据连接。
但现在问题是:检查连接是否存在时,DbKit.getConfig(dbid)返回的是空,导致重复去启动数据连接从而导致报错说连接已经存在。
所以jfinal中要如何判断数据连接是否已经存在?
public static RetKit getDblink(String dbid) { if (StrKit.notNull(DbKit.getConfig(dbid))) { return RetKit.ok("已成功连接数据库。"); } return RetKit.fail("无数据库连接存在。"); }
补充数据连接代码:
/** * 获取数据库连接 * * @param Kv * @return Ret msg */ public static RetKit getDblink(Record rec) { if (!StrKit.notNull(rec)) { return RetKit.fail("数据库连接参数空。"); } String dbid = rec.getStr(DBID); // 数据库连接ID // 判断数据库连接是否已经存在连接 RetKit hasDblink = getDblink(dbid); if (hasDblink.isOk()) { return hasDblink; } String dbtype = rec.getStr(DBTYPE); // 数据库类型 String dbhost = rec.getStr(DBHOST); // 数据库主机ip地址 String dbport = rec.getStr(DBPORT); // 数据库端口 String dbname = rec.getStr(DBNAME); // 数据库名称 String dbdriver = rec.getStr(DBDRIVER); // 数据库驱动器 String dburl = rec.getStr(DBURL); // 数据库连接地址 String dbusername = rec.getStr(DBUSERNAME); // 数据库用户名 String dbpassword = rec.getStr(DBPASSWORD); // 数据库密码 int dbmaxactive = StrKit.isBlank(rec.getStr(DBMAXACTIVE)) ? 100 : rec.getInt(DBMAXACTIVE); // 数据库最大活跃连接数 int iscase = StrKit.isBlank(rec.getStr(ISCASE)) ? -1 : rec.getInt(ISCASE); //字段大小写,0 是大写, 1是小写, -1不写是区分大小写 try { // 配置DruidPlugin数据库连接池 DruidPlugin dp = new DruidPlugin(dburl, dbusername, dbpassword, dbdriver); dp.set(1, 5, dbmaxactive); // 设置初始连接池大小、最小空闲连接数、最大活跃连接数 // 配置ActiveRecord数据库连接池插件 ActiveRecordPlugin arp = new ActiveRecordPlugin(dbid, dp); // 设置数据库方言等信息 switch (dbtype) { case "mysql": arp.setDialect(new MysqlDialect()); // 设置数据库方言 WallFilter wallFilter = new WallFilter(); // 加强数据库安全 wallFilter.setDbType("mysql"); dp.addFilter(wallFilter); break; case "sqlserver": arp.setDialect(new SqlServerDialect()); // 设置数据库方言 break; case "oracle": arp.setDialect(new OracleDialect()); // 设置数据库方言 iscase = 1; //oracle 配置属性名(字段名)大小写不敏感容器工厂。都转成小写 dp.setMaxPoolPreparedStatementPerConnectionSize(100); //在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 break; } if (dp.start() && arp.start()) { return RetKit.ok("连接数据库成功。"); } else { throw new SQLException("数据库连接池或管理器启动失败。"); // 抛出异常,不影响程序往下执 } } catch (Exception e) { e.printStackTrace(); return RetKit.fail("连接数据库异常。"); } }
项目:JFinal