feat: refactor database

Signed-off-by: MiaoWoo <admin@yumc.pw>
This commit is contained in:
MiaoWoo 2022-05-11 10:54:44 +08:00
parent 4ee8fc9a20
commit 47413c6766
5 changed files with 87 additions and 37 deletions

View File

@ -1,5 +1,45 @@
import { injectable } from "@ccms/container"
export namespace database { export namespace database {
export const DataBaseManager = Symbol("DataBaseManager"); export const DataSource = Symbol("DataSource")
export const DataSource = Symbol("DataSource"); /**
export const DataBase = Symbol("DataBase"); *
*/
export interface DataBaseConfig {
/**
*
*/
url: string | javax.sql.DataSource
/**
*
*/
driverClassName?: string
/**
*
*/
username?: string
/**
*
*/
password?: string
/**
*
*/
properties?: { [key: string]: any }
}
@injectable()
export abstract class DataBaseManager {
abstract setMainDatabase(mainDatabase: DataBase): void
abstract getMainDatabase(): DataBase
abstract createDatabase(name: string, config: DataBaseConfig): DataBase
abstract removeDatabase(name: string): boolean
abstract getDatabase(name: string): DataBase
}
@injectable()
export abstract class DataBase {
abstract query<T>(sql: string, ...args: any[]): Array<T>
abstract update(sql: string, ...args: any[]): number
abstract execute(sql: string): void
}
} }

View File

@ -113,7 +113,7 @@ export function loadMavenDepend(groupId: string, artifactId: string, version: st
let dependencies = doc.getElementsByTagName("dependency") let dependencies = doc.getElementsByTagName("dependency")
let size = dependencies.length let size = dependencies.length
if (!size) { return } if (!size) { return }
console.info(key, 'found', size, 'dependencies loading...') console.debug(key, 'found', size, 'dependencies loading...')
for (let i = 0; i < size; i++) { for (let i = 0; i < size; i++) {
const dependency = dependencies.item(i) const dependency = dependencies.item(i)
const gav = dependency.getChildNodes() const gav = dependency.getChildNodes()

View File

@ -115,13 +115,11 @@ function loadMiaoScriptConfig() {
if (!fs.exists(configFile)) { if (!fs.exists(configFile)) {
global.ScriptEngineConfig = base.save(configFile, yaml.dump({ global.ScriptEngineConfig = base.save(configFile, yaml.dump({
uuid: UUID.randomUUID().toString(), uuid: UUID.randomUUID().toString(),
channel: 'latest',
slow_execute: 50 slow_execute: 50
})) }))
} else { } else {
global.ScriptEngineConfig = yaml.load(base.read(configFile)) global.ScriptEngineConfig = yaml.load(base.read(configFile))
} }
global.ScriptEngineChannel = global.ScriptEngineConfig.channel || 'latest'
global.ScriptSlowExecuteTime = global.ScriptEngineConfig.slow_execute || 50 global.ScriptSlowExecuteTime = global.ScriptEngineConfig.slow_execute || 50
} }

View File

@ -1,32 +1,12 @@
import { JSClass } from '@ccms/container' import { database } from '@ccms/api'
import { Model } from './model' import { JSClass, postConstruct } from '@ccms/container'
/** const Properties = Java.type('java.util.Properties')
*
*/
export interface DataBaseConfig {
/**
*
*/
url: string | javax.sql.DataSource
/**
*
*/
driverClassName?: string
/**
*
*/
username?: string
/**
*
*/
password?: string
}
/** /**
* *
*/ */
export class DataBase { export class DataBase extends database.DataBase {
private dataSource: javax.sql.DataSource private dataSource: javax.sql.DataSource
private jdbcTemplate: org.springframework.jdbc.core.JdbcTemplate private jdbcTemplate: org.springframework.jdbc.core.JdbcTemplate
@ -37,13 +17,13 @@ export class DataBase {
@JSClass('org.springframework.jdbc.core.JdbcTemplate') @JSClass('org.springframework.jdbc.core.JdbcTemplate')
private JdbcTemplate: typeof org.springframework.jdbc.core.JdbcTemplate private JdbcTemplate: typeof org.springframework.jdbc.core.JdbcTemplate
constructor(dbConfig: DataBaseConfig) { constructor(dbConfig: database.DataBaseConfig) {
super()
if (!dbConfig.url) { throw new Error('DataBase url can\'t be null!') } if (!dbConfig.url) { throw new Error('DataBase url can\'t be null!') }
this.createDataSource(dbConfig) this.createDataSource(dbConfig)
this.initialize()
} }
private createDataSource(dbConfig: DataBaseConfig) { private createDataSource(dbConfig: database.DataBaseConfig) {
if (typeof dbConfig.url === "string") { if (typeof dbConfig.url === "string") {
let config = new this.HikariConfig() let config = new this.HikariConfig()
if (dbConfig.driverClassName) { if (dbConfig.driverClassName) {
@ -56,12 +36,20 @@ export class DataBase {
config.setPassword(dbConfig.password) config.setPassword(dbConfig.password)
} }
config.setJdbcUrl(dbConfig.url) config.setJdbcUrl(dbConfig.url)
if (dbConfig.properties) {
let properties = new Properties()
for (const key in dbConfig.properties) {
properties.setProperty(key, dbConfig.properties[key])
}
config.setDataSourceProperties(properties)
}
this.dataSource = new this.HikariDataSource(config) this.dataSource = new this.HikariDataSource(config)
} else { } else {
this.dataSource = dbConfig.url this.dataSource = dbConfig.url
} }
} }
@postConstruct()
private initialize() { private initialize() {
this.jdbcTemplate = new this.JdbcTemplate(this.dataSource) this.jdbcTemplate = new this.JdbcTemplate(this.dataSource)
} }
@ -69,6 +57,7 @@ export class DataBase {
/** /**
* SQL查询 * SQL查询
* @param sql SQL语句 * @param sql SQL语句
* @param args
*/ */
query<T>(sql: string, ...args: any[]): Array<T> { query<T>(sql: string, ...args: any[]): Array<T> {
let startTime = Date.now() let startTime = Date.now()
@ -80,6 +69,7 @@ export class DataBase {
/** /**
* SQL更新 * SQL更新
* @param sql SQL语句 * @param sql SQL语句
* @param args
*/ */
update(sql: string, ...args: any[]): number { update(sql: string, ...args: any[]): number {
let startTime = Date.now() let startTime = Date.now()
@ -88,6 +78,16 @@ export class DataBase {
return result return result
} }
/**
* SQL语句
* @param sql SQL语句
*/
execute(sql: string): void {
let startTime = Date.now()
this.jdbcTemplate.execute(sql)
console.debug(java.lang.String.format(`\n[DB] execute \nSQL : sql} \nCOST : ${Date.now() - startTime}ms`))
}
close() { close() {
//@ts-ignore //@ts-ignore
this.dataSource.close() this.dataSource.close()

View File

@ -1,12 +1,17 @@
import { database } from '@ccms/api' import { database } from '@ccms/api'
import { provideSingleton } from '@ccms/container' import { provideSingleton } from '@ccms/container'
import { DataBase, DataBaseConfig } from './database' import { DataBase } from './database'
@provideSingleton(database.DataBaseManager) @provideSingleton(database.DataBaseManager)
export class DataBaseManager { export class DataBaseManager extends database.DataBaseManager {
private mainDatabase: DataBase private mainDatabase: DataBase
private databases = new Map<string, DataBase>() private databases = new Map<string, DataBase>()
constructor() {
super()
process.on('exit', () => this.disable())
}
/** /**
* *
* @param mainDatabase * @param mainDatabase
@ -29,8 +34,8 @@ export class DataBaseManager {
* @param name database Name use at code * @param name database Name use at code
* @param config * @param config
*/ */
createDatabase(name: string, config: DataBaseConfig) { createDatabase(name: string, config: database.DataBaseConfig) {
Java.synchronized(() => { return Java.synchronized(() => {
if (!this.databases.has(name)) { if (!this.databases.has(name)) {
this.databases.set(name, new DataBase(config)) this.databases.set(name, new DataBase(config))
} }
@ -38,6 +43,13 @@ export class DataBaseManager {
}, this.databases)() }, this.databases)()
} }
removeDatabase(name: string) {
if (this.databases.has(name)) {
this.databases.get(name).close()
}
return this.databases.delete(name)
}
getDatabase(name: string) { getDatabase(name: string) {
return this.databases.get(name) return this.databases.get(name)
} }