vertica开启ROS


vertica默认批量插入是关闭的,需要手动设置DataSourceProperties开启,详细参考JDBC Connection Properties,文档中该参数介绍如下:

  • DirectBatchInsert

Determines whether a batch insert stored data directly into ROS (true) or using AUTO mode (false).

When you load data using AUTO mode, Vertica inserts the data first into the WOS. If the WOS is full, Vertica inserts the data directly into ROS. For details about load options, see Choosing a Load Method.

Set After Connection: VerticaConnection.setProperty()

Default Value: false

在jdbc方式和spring中集成数据源方式略有不同,下面分开介绍

JDBC方式

jdbc方式配置比较灵活,可以在DriverManager.getConnection获取连接设置属性

也可以获取到connection以后设置

  • 获取连接时
Properties myProp = new Properties();
myProp.put("user", "ExampleUser");
myProp.put("password", "password123");
// Enable directBatchInsert for this connection
myProp.put("DirectBatchInsert", "true");
Connection conn;
try {
    conn = DriverManager.getConnection(
         "jdbc:vertica://VerticaHost:5433/ExampleDB", myProp);
. . .
  • 获取连接后
((VerticaConnection)conn).setProperty("DirectBatchInsert", true);

使用HikariDataSource连接池

当我们使用spring框架开发时,一般会使用数据库连接池对象,spring boot中默认的连接池是HikariCP,下面介绍``HikariCP`如何配置该参数,思路可以参考使用jdbc时获取连接以后的方式。

但是又因为spring中的bean是基于proxy进行创建的,所有我们获取到的连接对象不再是VerticaConnection,而是HikariProxyConnection,但是该对象并没有setProperty()方法,所以不能使用强制类型转换并且设置该属性

Connection connection = dataSource.getConnection();

boolean flag1 = connection instanceof com.vertica.jdbc.VerticaConnection; // false
boolean flag2 = connection instanceof com.zaxxer.hikari.pool.HikariProxyConnection; //true

正确做法如下:

获取到当前连接的HikariDataSource对象,然后给该对象设置DataSourceProperties即可开启ROS,并且可以使用连接池管理jdbc连接

public DataSource config(DataSource dataSource, HikariConfig config, boolean isVertica) {
  HikariDataSource hikariDataSource = null;
  if (dataSource instanceof HikariDataSource) {
    // 连接池配置
    hikariDataSource = (HikariDataSource) dataSource;

    if (isVertica) {
      Properties properties = new Properties();
      // Loading Batches Directly into ROS Enable directBatchInsert for this connection
      properties.put("DirectBatchInsert", "true");
      hikariDataSource.setDataSourceProperties(properties);
    }

    hikariDataSource.setPoolName(config.getPoolName());
    hikariDataSource.setAutoCommit(config.isAutoCommit());
    hikariDataSource.setConnectionTestQuery(config.getConnectionTestQuery());
    hikariDataSource.setIdleTimeout(config.getIdleTimeout());
    hikariDataSource.setConnectionTimeout(config.getConnectionTimeout());
    hikariDataSource.setMaximumPoolSize(config.getMaximumPoolSize());
    hikariDataSource.setMaxLifetime(config.getMaxLifetime());
    hikariDataSource.setMinimumIdle(config.getMinimumIdle());
  }
  return hikariDataSource == null ? dataSource : hikariDataSource;
}

文章作者: 小张哥
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小张哥 !
评论
 上一篇
正则表达式 正则表达式
正则表达式元字符 元字符 说明 . 匹配除了换行符以外的任意字符 * 指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配 .* 任意数量的不包含换行的字符 \b 单词的开头或结尾,也就是单词的分界处 \w
下一篇 
Maven加载本地jar文件 Maven加载本地jar文件
日常开发中都是maven加载在远程仓库的jar文件,如果远程仓库没有相应的jar文件,一般做法就是自己传到一个特定的nexus服务器上,但是本地开发测试的时候可能nexus服务器不太方便,那么我们可以使用maven加载本地的jar文件 mv
2020-02-28
  目录