2017-07-19 59 views
1

我有一个java应用程序(jar)作为OSGI包安装在Adobe体验管理器中。MyBatis数据库连接故障切换机制不起作用

在Java应用我有以下数据源的配置: 1.我使用的MyBatis-3在以下载人管理数据源汇集的连接: 使用特性如http://www.mybatis.org/mybatis-3/getting-started.html

2. Creating SQL Session factory in following manner : 
     SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration); 

3. Using SQL Server 2014 as my database. 
提到

我们拥有数据库服务器集群,每当我们必须将修补程序应用于数据库时,我们切换数据库服务器。 即使dataSource URL保持不变,应用程序也会导致数据库连接失败错误。 仅在捆绑restard后才能解决问题。 连接池是否有任何方式可以自动重新连接或恢复? 我是MyBatis,SQL服务器和AEM的新手,非常感谢任何帮助。

+0

我假设你的冷备用方法,所有已经打开的数据库连接都会失败。对不起,我不知道MyBatis。但是,无论您是找到更好的集群方法,还是应该使用ConnectionPool进行验证。这意味着在派发连接之前,ConnectionPool会进行极其简单的查询。如果失败,这个错误的连接将被丢弃,并打开一个新的连接。其他人也问过它,但没有在这里得到答案:http://mybatis-user.963551.n3.nabble.com/Connection-is-invalid-how-to-check-for-this-and- get-a-valid-connection-td4026961.html –

回答

2

对你来说最简单的解决方法是设置一个pool-ping-query。看起来,您的连接在切换到冷备用数据库时无法生存。他们必须重新开放。通过这个查询,连接池可以检查连接是否仍然正常。如果没有,这个错误的连接将被关闭。我看了一下http://www.mybatis.org/mybatis-3/configuration.html。在那里,你应该寻找参数

  • poolPingQuery
  • poolPingEnabled

我会与下面的配置

<dataSource type="POOLED"> 
    ... 
    <property name="poolPingQuery" value="/* ping */ SELECT 1"/> 
    <property name="poolPingEnabled" value="true"/> 
</dataSource> 

尝试,但要知道,这是仍然不是一个优美的开关。它只检查池中的连接。所有正在运行的交易仍然会出现错误。但是,如果您的交易时间很短,而不是大规模并行,而且不是非常关键,那么它可能就没有问题。

+0

谢谢你快速转身,我读了关于poolPingQuery,但我没有发现它可以用来重新建立连接。我们有什么方法可以进行优雅的切换,以避免正在进行的用户会话出现任何错误? – Narendra

+1

我认为,这不适用于您的Active/Passive SQL服务器群集。您需要一个阶段,两个节点都处于活动状态。在此主动/主动阶段,您必须正常切换所有连接。 如果故障转移非常重要,那么您可能必须放弃连接池。这可能会让一些事情变得更好。但表现会受到影响。 –

+0

我查看了SQL Server文档。它说:“发生故障转移时,虚拟网络名称(VNN)在启动后注册到新的活动节点。对于连接到SQL Server的客户端或应用程序,此过程是透明**,并且**最大限度地减少了故障期间的应用程序或客户端的停机时间。“ 故障切换仅适用于**新**连接,我担心,你必须仔细测试SQL集群是如何工作的,最终“选择1”仍然可以工作,即使连接的节点不再是活动的 –