为什么MySQL引入Double Writer?

本文深入探讨了InnoDB双写机制的原理、作用及性能影响,解释了其为何能够解决部分写问题,并通过参数配置展示如何监控双写操作。
㈠ 是什么
   
   double writer是ibdata1(共享表空间)里面的一块连续空间
   BTW:为什么取名时叫buffer呢?难道一切缓冲写都叫buffer,加速读叫cache,哈哈
   
㈡ 为什么需要
   
   redo有效应用的前提是data的一致性,当data flush到磁盘时发生故障,比如16K只写了4K
   并且redo条目是change vector形式,属于逻辑记录,那么在InnoDB recovery时,redo就不知道从哪开始跑起
   简言之,就是为了解决部分写问题(partial page write)
   
㈢ 影响性能吗
   
   第一阶段,data写到double writer buffer属于顺序IO,节省IO开销
   第二阶段,因为double writer buffer积累了很多dirty page,再写向真正的位置时有可能合并,减少fsync()次数
   故,对性能影响不大
   
㈣ 相关参数
   
   ① show variables like '%double%'; <==确认是否开启
   ② show status like '%innodb_dblwr%'; <==展示进来和出去的page数量,并且能计算有多少块被合并写出
   
   
参考资料:
http://www.orczhou.com/index.php/2010/02/innodb-double-write/
   


By 迦夜
2013-10-26
Good Luck 
<think>嗯,用户的问题是想用Java将MySQL中的地理数据导出为GDB格式。首先,我需要确定GDB格式的具体要求。GDB通常指的是Esri的地理数据库格式,有两种类型:文件地理数据库(File Geodatabase)和Personal Geodatabase。用户可能指的是文件地理数据库,因为Personal Geodatabase使用Microsoft Access,而文件GDB更常见且开放。 接下来,我需要考虑Java中处理地理数据的库。常见的库有GeoTools和GDAL。GeoTools是一个开源的Java库,支持处理地理空间数据,而GDAL有Java绑定,但配置可能复杂。用户可能需要使用GeoTools来实现导出功能。 然后,步骤分解。首先需要从MySQL中读取地理数据,可能需要使用JDBC连接数据库,并执行查询获取几何数据。MySQL中的地理数据可能以WKT或二进制格式存储,比如使用GEOMETRY类型的字段。需要将这些数据解析为GeoTools能够处理的几何对象,比如通过JTS库。 接着,创建GDB文件。GeoTools提供了DataStore接口来连接不同的数据源,包括FileGDB数据存储。需要配置DataStore的参数,比如指定文件路径和是否新建数据库。然后,定义FeatureType,即要素的结构,包括属性字段和几何字段的类型。 然后,将数据写入GDB。遍历从MySQL获取的结果集,为每条记录创建Feature实例,设置属性值,包括几何数据。最后将Feature添加到FeatureCollection,并写入DataStore。 可能遇到的问题包括依赖库的版本兼容性,特别是GeoTools和FileGDB插件的版本需要匹配。另外,几何类型的转换可能需要特别注意,比如确保MySQL中的几何类型与目标GDB的几何类型一致。此外,处理大量数据时需要考虑性能问题,可能需要分批次写入。 用户可能需要示例代码来指导实现,所以提供一个简单的代码框架会有帮助。同时,需要注意JDBC连接参数的正确性,以及GeoTools库的正确引入。还需要提醒用户处理异常和资源释放,比如关闭数据库连接和DataStore。 另外,用户可能需要了解相关工具和库的文档链接,以便进一步查阅。例如,GeoTools的官方文档和GDAL的Java绑定信息。此外,可能还需要考虑坐标系统的定义,确保导出的数据具有正确的空间参考。 最后,生成的相关问题需要围绕实现过程中的可能难点,比如性能优化、处理复杂几何类型、坐标转换等,以及替代方案和不同格式的导出方法。</think>根据技术要求,以下是Java实现MySQL地理数据导出GDB格式的分步解决方案: # Java实现MySQL转GDB方案 ## 一、技术选型 1. **GeoTools 28.2**(开源地理数据处理库) 2. **GDAL 3.6.4**(需配合Java Native Interface) 3. **MySQL Connector/J 8.0**(官方JDBC驱动) 4. **FileGDB API 1.5.2**(Esri官方文件地理数据库接口) 推荐使用GeoTools作为核心库,其FileGDB插件支持文件地理数据库的读写操作[^1]。 ## 二、实现步骤 ### 1. 环境配置(pom.xml) ```xml <dependency> <groupId>org.geotools</groupId> <artifactId>gt-main</artifactId> <version>28.2</version> </dependency> <dependency> <groupId>org.geotools</groupId> <artifactId>gt-filegeodatabase</artifactId> <version>28.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> ``` ### 2. 数据库连接 ```java String url = "jdbc:mysql://localhost:3306/geo_db?useSSL=false&serverTimezone=UTC"; try (Connection conn = DriverManager.getConnection(url, "user", "password")) { String query = "SELECT id, name, ST_AsBinary(geometry) AS geom FROM features"; // 处理结果集... } ``` ### 3. 几何数据转换 使用JTS几何库进行WKB解析: ```java ResultSet rs = stmt.executeQuery(); while (rs.next()) { byte[] wkb = rs.getBytes("geom"); Geometry geometry = new WKBReader().read(wkb); // 转换坐标系(如需要) MathTransform transform = CRS.findMathTransform( DefaultGeographicCRS.WGS84, CRS.decode("EPSG:3857") // Web墨卡托 ); Geometry transformed = JTS.transform(geometry, transform); } ``` ### 4. 创建GDB文件 ```java Map<String, Object> params = new HashMap<>(); params.put("dbtype", "filegeodatabase"); params.put("directory", "/path/to/output.gdb"); params.put("create", true); DataStore gdbStore = DataStoreFinder.getDataStore(params); SimpleFeatureTypeBuilder typeBuilder = new SimpleFeatureTypeBuilder(); typeBuilder.setName("features"); typeBuilder.add("geom", Polygon.class, CRS.decode("EPSG:3857")); typeBuilder.add("name", String.class); typeBuilder.add("id", Integer.class); gdbStore.createSchema(typeBuilder.buildFeatureType()); ``` ### 5. 批量写入优化 ```java Transaction transaction = new DefaultTransaction(); try (FeatureWriter<SimpleFeatureType, SimpleFeature> writer = gdbStore.getFeatureWriterAppend(typeName, transaction)) { for (Geometry geom : geometries) { SimpleFeature feature = writer.next(); feature.setAttribute("geom", geom); feature.setAttribute("name", rs.getString("name")); feature.setAttribute("id", rs.getInt("id")); writer.write(); } transaction.commit(); } catch (Exception e) { transaction.rollback(); } ``` # 关键问题处理 1. **坐标转换**:使用`ReprojectingFeatureCollection`处理CRS转换 2. **性能优化**:每5000条提交事务,使用`FeatureCollection`批量操作 3. **类型映射**: $$MySQL \Rightarrow GDB类型对应表$$ | MySQL类型 | GDB类型 | 转换方法 | |----------|-----------|-------------------| | GEOMETRY | Geometry | WKB直接解析 | | VARCHAR | String | 直接映射 | | DOUBLE | Double | Precision处理 | #
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值