我的任务是将数据从oracle数据库导入elasticsearch。当然我用的是jdbc输入插件。
由于性能原因,我需要为插件启用准备好的语句(它将减少对数据库的读取操作,并将提高索引的正确使用率)
我的配置如下:
input {
jdbc {
jdbc_fetch_size => 999
schedule => "* * * * *"
use_prepared_statements => true
prepared_statement_name => "foo"
prepared_statement_bind_values => [":sql_last_value"]
statement => " SELECT
......
FROM table_name tbl
JOIN ......
JOIN ...
LEFT JOIN ......
WHERE tbl.id > ?
"
use_column_value => true
tracking_column => "id"
}
}
但我遇到了一个问题。激活后:
日志存储中不传输任何事件
不会在elk中创建新文档
cpu使用率和内存消耗为100%。
一段时间后,日志存储出现以下错误:java.lang.bootstrapmethoderror:调用站点初始化异常
几句重要的话:
我是否将jdbc\u fetch\u size更改为更小或更大的值并不重要(它只影响内存消耗的速度)
在数据量较小的情况下,一切都可以正常工作—创建elk索引中的文档,但有轻微的延迟,这在禁用prepared语句时不会发生。
当准备好的语句被禁用时,即使有大数据,一切都可以正常工作,没有任何延迟
我已经在7.8.0和7.9.0两个版本上测试过了-结果都一样-不起作用。
我是在对付虫子吗?
2条答案
按热度按时间0md85ypi1#
您对jdbc驱动程序类使用什么值?
java::oracle.jdbc.driver.oracledriver(驱动程序本身是oracle:oracle:11.2.0.4-jdk6-sp1)
如果直接对数据库执行查询会发生什么?
它正在工作(很长,因为返回的条目太多),但它没有崩溃,并且语句一直显示(在oracle控制台上检查)。
sql语句从数据库返回多少条记录?
1.93亿张唱片
你试过只从数据库返回一批行吗
是的,对于有限的记录,它可以工作,但这不是我的选择-我需要获取所有记录,而不仅仅是其中的一部分(使用
rownum
不保证)在这里,准备好的语句的问题是它崩溃了,我并不抱怨持久的导入(我已经准备好了——大量的记录强制执行了它)
31moq8wy2#
你用什么价值
jdbc_driver_class
?如果直接对数据库执行查询会发生什么?
sql语句从数据库返回多少条记录?你试过只从数据库返回一批行吗?为此,您可以将sql语句更改为: