使用Spring的Java Web应用程序。
我们目前正在使用MySQL,并希望迁移到MariaDB。所以我们也计划从MySQL Connector迁移到MariaDB Client。
我们的软件在同一台服务器上使用多个数据库,一些表可以具有相同的名称,但在两个不同的数据库上。在MySQL Connector上,这不是问题。我们只是使用了一个已经连接到正确数据库的数据源,JDBCTemple知道它必须在当前模式中搜索表。
另一方面,MariaDB客户端不使用模式来区分数据库,而是使用catalog。Spring似乎没有意识到这一点。因此,当我们在迁移之后测试我们的软件时,JDBCTemplate会发现多个同名的表,因为模式总是空的,并且似乎只是使用列表中的最后一个来获取表的元数据。这显然会导致到处都是意想不到的错误。
我们设法通过添加withCatalogName来纠正这个行为JDBCTemplace调用(请参阅下面的代码),但是这样做并不是一个非常优雅的解决方案。
SimpleJdbcInsert insertStatement = new SimpleJdbcInsert(getJdbcTemplate());
[...] // business code
insertStatement.executeBatch(sqlParameterSource); // fails
insertStatement.withCatalogName("dbName").executeBatch(sqlParameterSource); // succeeds
字符串
所以我的问题是,有没有一种方法可以告诉Spring我们正在使用MariaDB客户端,并且它应该总是使用目录而不是模式来获取元数据?
我们已经用jdbc:mariadb
前缀设置了URL连接,所以Spring知道我们使用的是MariaDB而不是MySQL。
我们不能实际修改我们的软件,使所有内容都在同一个数据库中。即使只是将表名更改为跨服务器的唯一名称,也会比我们计划的MariaDB迁移花费更多。
编辑:我们也已经在连接属性中将org.mariadb.jdbc.Driver
设置为新的驱动程序。
编辑2:发现了问题,我们在connection properties中使用了nullDatabaseMeansCurrent,这样Spring就可以毫无麻烦地访问表元数据,但是MariaDB connector不支持这个属性。尚不知道是否有解决方案。
2条答案
按热度按时间rjzwgtxy1#
使用元数据时,连接器根据参数请求元数据。例如DatabaseMetaData.html #getColumns当设置not catalog和table name时,将搜索所有catalog中对应的所有表,schema设置将被忽略。
mysql连接器有两个mariadb连接器没有的选项:
nullDatabaseMeansCurrent
,以便即使在没有设置数据库时也搜索当前数据库,以及databaseTerm
,其指示使用设置目录或模式。我想你可以使用其中的一个选项,或者使用
nullDatabaseMeansCurrent
设置模式,或者使用设置databaseTerm
和连接器,然后使用模式参数。第二部分将在https://jira.mariadb.org/projects/CONJ/issues/CONJ-1088中实现。现在可能是时候在jira上创建一个issue来支持
nullDatabaseMeansCurrent
了。7xllpg7q2#
我不是100%确定,但是你需要改变spring属性/.yml文件,并告诉spring sql驱动程序和数据库将使用。像这样(只需将postgre或mysql更改为mariaDB。):
字符串