3.3 数据文件的导入
用于将数据从XML文件导入到活动的数据库中。对于导入过程可以是批量导入也可以是逐条插入方式。
对于批量导入,会将XML文件中所有的字段数据都将导入到数据库中。而采取逐条插入的方式可以条件地插入指定的字段。同样,整个导入过程不需要开发人员关注,全部由DdlUtils完成。
数据的导入必须结合数据库模型和数据文件和数据源来完成。以下代码中,通过数据接收器(sink)对数据文件中的数据进行了批量导入:
(1)通过数据库模型创建数据接收器(DataToDatabaseSink)
(2)通过指定数据读取对象(DataReader)的数据接收器(setSink),实现数据文件的批量读取(DataReader对象的parse方法)
需要说明的是:通过数据库数据I/O类(DatabaseDataIO)的写入方法(writeDataToDatabase)也可以实现将数据批量写入到数据库中,但是经过试验和分析,摸索出采用数据接收器的方式来进行批量插入,大大避免了与数据的“直接接触”,极大简化了处理过程。
以下是关键代码:
DataSource ds = setupDataSource(); //Creates a new platform for the specified database. Platform pf = PlatformFactory.createNewPlatformInstance(ds); //Creates a new sink instance. DataToDatabaseSink dtds = new DataToDatabaseSink(pf, __db); DataReader dr = new DataReader(); //Sets the database model. dr.setModel(__db); //Sets the data sink. dr.setSink(dtds); //Sets the (maximum) number of beans to insert in one batch. dtds.setBatchSize(64); //Notifies the sink that beans will be added. dtds.start(); //Parse the content of the specified file using this Digester. //Returns the root element from the object stack (if any). dr.parse(__dataFile); //Notifies the sink that all beans have been added. dtds.end();
4 结束语
不超过100行的代码,就实现了数据库模型的提取,数据库数据的导出和数据文件的导入。特别的是,用户甚至都不用知道数据库中数据的结构和内容。无论从工程的可维护性还是稳定性和执行效率却都是令人相当满意。
特别是数据文件的导入中,采用了笔者自己摸索出来的数据接收器的方式,极大简化了数据的批量导入。该环节对于缩短客户端与数据库中心的交互时间是相当有效的。
但是,要实现客户端与数据库中心同步,就可能会遇到插入冲突的问题。即:如果客户端的数据与数据库中心的数据存在重复,那么在客户端数据导入到数据库中心的过程中就会发生异常。这个时候就可能不得不通过冲突检测来进行非批量的插入。虽然关于DdlUtils带有冲突检测的批量导入还在评价之中,但是无庸置疑的是:这样势必大大降低客户端与数据库中心同步的效率。
基于这一点考虑,通过一定的业务规定来避免客户端的数据与数据库中心产生冲突,也未尝不是一个高效的做法。