有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有两个数据库old&newolddb细节需要过滤/处理并存储到new

OLD DB

  1. 我有大约10000个配置(DB行)

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

NEW DB

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

  2. 以及每个配置的一些建议

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

为了获取每个配置id的blob,需要建立一个新的连接&;它开了很长时间

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 1之后,我创建了一个临时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条记录的反应如何。请帮忙

更新

每次配置大约需要3-6秒


共 (1) 个答案

  1. # 1 楼答案

    使用数据库连接池总是更有效,让容器在需要时管理建立和关闭该连接。创建连接、执行语句,然后关闭该连接,可以通过一个池来避免,该池将在给您提供要使用的连接之前预连接,并且在大多数情况下(您描述的细节),由于连接可能已经连接,因此无需进行连接

    因此,是的,保持连接开放更有效,汇集连接更好