Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Kafka JDBC接收器连接器-不支持使用语句在数据库之间切换_Sql Server_Jdbc_Apache Kafka - Fatal编程技术网

Sql server Kafka JDBC接收器连接器-不支持使用语句在数据库之间切换

Sql server Kafka JDBC接收器连接器-不支持使用语句在数据库之间切换,sql-server,jdbc,apache-kafka,Sql Server,Jdbc,Apache Kafka,我正在使用Kafka JDBC接收器连接器将数据接收器到Azure SQL server。我已经用一个数据库测试了连接器,它工作得很好,但是当我添加更多数据库时,我开始看到以下错误: 不支持使用语句在数据库之间切换。使用新连接连接到其他数据库。 配置: tasks.max: 1 topics: topic_name connection.url: jdbc:sqlserver://server:port;database=dbname;user=dbuser co

我正在使用Kafka JDBC接收器连接器将数据接收器到Azure SQL server。我已经用一个数据库测试了连接器,它工作得很好,但是当我添加更多数据库时,我开始看到以下错误:

不支持使用语句在数据库之间切换。使用新连接连接到其他数据库。

配置:

    tasks.max: 1
    topics: topic_name
    connection.url: jdbc:sqlserver://server:port;database=dbname;user=dbuser
    connection.user: dbuser
    connection.password: dbpass
    transforms: unwrap
    transforms.unwrap.type: io.debezium.transforms.ExtractNewRecordState
    transforms.unwrap.drop.tombstones: false
    auto.create: true
    value.converter: org.apache.kafka.connect.json.JsonConverter
    value.converter.schemas.enable: true
    insert.mode: upsert
    delete.enabled: true
    pk.mode: record_key
堆栈:

2020-12-10 11:56:36,990 ERROR WorkerSinkTask{id=NAME-sqlserver-jdbc-sink-0} Task threw an uncaught and unrecoverable exception. Task is being killed and will not recover until manually restarted. Error: java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: USE statement is not supported to switch between databases. Use a new connection to connect to a different database.
 (org.apache.kafka.connect.runtime.WorkerSinkTask) [task-thread-NAME-sqlserver-jdbc-sink-0]
org.apache.kafka.connect.errors.ConnectException: java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: USE statement is not supported to switch between databases. Use a new connection to connect to a different database.

        at io.confluent.connect.jdbc.sink.JdbcSinkTask.put(JdbcSinkTask.java:87)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.deliverMessages(WorkerSinkTask.java:560)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.poll(WorkerSinkTask.java:323)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.iteration(WorkerSinkTask.java:226)
        at org.apache.kafka.connect.runtime.WorkerSinkTask.execute(WorkerSinkTask.java:198)
        at org.apache.kafka.connect.runtime.WorkerTask.doRun(WorkerTask.java:185)
        at org.apache.kafka.connect.runtime.WorkerTask.run(WorkerTask.java:235)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.sql.SQLException: com.microsoft.sqlserver.jdbc.SQLServerException: USE statement is not supported to switch between databases. Use a new connection to connect to a different database.


如果它不能作为单个连接器工作,那么您需要为每个数据库创建一个连接器。

我已经确定了这个问题,一开始我认为这个问题是由于数据库服务器中有多个数据库,但后来发现主题名中有
前缀.dbo.table_name
。而不仅仅是
表名
。 因此,连接器将
prefix.dbo
检测为另一个数据库

解决方案是使用transform dropPrefix

例如,要将主题
hello.dbo.table1
hello.dbo.table2
中的数据保存到数据库中的
table1
table2
,请使用以下配置:

    tasks.max: 1
    topics: hello.dbo.table1, hello.dbo.table2
    connection.url: jdbc:sqlserver://server:port;database=dbname;user=dbuser
    connection.user: dbuser
    connection.password: dbpass
    transforms: dropPrefix,unwrap
    transforms.dropPrefix.type: org.apache.kafka.connect.transforms.RegexRouter
    transforms.dropPrefix.regex: hello\.dbo\.(.*)
    transforms.dropPrefix.replacement: $1
    transforms.unwrap.type: io.debezium.transforms.ExtractNewRecordState
    transforms.unwrap.drop.tombstones: false
    auto.create: true
    value.converter: org.apache.kafka.connect.json.JsonConverter
    value.converter.schemas.enable: true
    insert.mode: upsert
    delete.enabled: true
    pk.mode: record_key

它是每个数据库一个连接器。这个例子只是将一个主题中的数据汇聚到一个数据库中。这与您在问题中所说的“当我添加更多数据库时”相矛盾。请澄清,也许在您的问题中包括引发您看到的错误的实际接收器连接器配置。抱歉,不清楚。我的意思是将更多数据库添加到DB服务器,而不是连接器中。我已经确定了这个问题,它与主题名有
前缀.dbo.tablename
有关,连接器将其视为另一个数据库
table.name.format
很好,但当我只有一个主题时。这里提出了一个问题:支持表前缀,这将是理想的,但看起来它仍然是开放的。不清楚“添加更多数据库”是什么意思。您在连接器配置中这样做了吗?谢谢,@OneCricketeer我一开始以为问题是由于db服务器中有多个数据库,但结果发现主题名称中有前缀.dbo.table_name。而不仅仅是表名。我已经在我的回答中发布了详细信息,我想说的是,在DB服务器中有多个模式是一个标准用例,所以这不会是一个问题