gpt4 book ai didi

java - 打开一个新的数据库连接或保持连接打开直到进程完成是好事吗?

转载 作者:行者123 更新时间:2023-12-05 00:07:13 24 4
gpt4 key购买 nike

我有 2 个数据库 oldnewold 数据库详细信息需要过滤/操作并存储到 new

OLD DB

  1. 我有大约 10000 个配置(数据库行)

  2. 和 10000 个 BLOBS(xml 文件大小平均为 4MB)与上面的配置 ID 匹配

NEW DB

  1. 1 个新表将包含旧表的过滤数据,但这次没有 BLOB 数据,而是绝对路径

  2. 和每个配置的一些建议

我在这里写了一个程序(使用 Groovy 和 MyBatis for DB)它获取 OLD DB 中可用的所有配置记录并存储在类列表中并且数据库连接关闭

为了也为每个配置 ID 获取 BLOBS,建立了一个新连接并长时间保持打开状态

List<String> projectid
List<CSMConfigInfo> oldConfigs
List<ConfigInfo> newConfigs
Map<String,CSMConfigInfo> oldConfigMap

SqlSession session = DatabaseConnectivity.getOldCSMDBSessionFactory().openSession()
/* trying to batch execute based on project id */
projectid.each {pid->
logger.info "Initiating conversion for all configuration under $pid project id"
oldConfigMap.each {k,v->
/* Here I am keeping a DB connection open for a long time */
if(pid.equals(v)){
createFromBlob(k,session)
}
}
logger.info "Completed for $pid project id\n"
}

session.close()

在一个接一个地获取 BLOB 之后,我创建了一个临时 xml 文件,该文件经过解析以应用过滤器以插入到 NEW DB 中。在下面的代码中,您可以看到根据 xml 是否可转换和可解析,为 NEW DB 打开了一个新连接。这是好的做法还是我需要为所有 10000 条记录保持 NEW DB 连接打开?

/* XML is converted to new format and is parsable */
def createFromBlob(CSMConfigInfo cfg,SqlSession oldCSMSession){
.
.

if(xmlConverted&&xmlParsed){
//DB Entries
try{
/* So now here I am opening a new connection for every old config record, which can be 10000 times too, depending on the filter */
SqlSession sess = DatabaseConnectivity.getNewCSMSessionFactory().openSession()

//New CSM Config
makeDatabaseEntriesForConfiguration(newConfig,sess)
//Fire Rules
fireRules(newConfig,sess,newCSMRoot)

sess.close()

}
catch(IOException e){
logger.info "Exception with ${newConfig.getCfgId().toString()} while making DB entries for CONFIG_INFO"
}
logger.info "Config id: "+cfg.getCfgId().toString()+" completed successfully, took "+getElapsedTime(startTime)+ " time. $newabspath"
}
else{
def errormsg = null
if(!xmlConverted&&!xmlParsed)
errormsg = "Error while CONVERSION & PARSING of config id "+cfg.getCfgId().toString()+", took "+getElapsedTime(startTime)+ " time."
else if(!xmlConverted)
errormsg = "Error while CONVERSION of config id "+cfg.getCfgId().toString()+", took "+getElapsedTime(startTime)+ " time."
else if(!xmlParsed)
errormsg = "Error while PARSING of config id "+cfg.getCfgId().toString()+", took "+getElapsedTime(startTime)+ " time."
logger.info errormsg
}

makeDatabaseEntriesForConvertStatus(csmConfigConvertStatus,oldCSMSession)
}

这目前适用于 20 条记录,但我不确定它对所有 10000 条记录会有何 react 。请帮忙

更新

每个配置我需要大约 3-6 秒

最佳答案

使用数据库连接池总是更有效,让容器在需要时管理建立和关闭该连接。创建一个连接,执行你的语句然后关闭该连接可以避免使用一个池,该池将在为你提供要使用的连接之前进行预连接,并且在大多数情况下(特别是你所描述的)不需要建立连接它可能已经连接。

因此,是的,保持连接打开更有效,甚至更好地集中您的连接...

关于java - 打开一个新的数据库连接或保持连接打开直到进程完成是好事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13374574/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com