假设有一个PostgreSQL集群,它由一个主节点和两个只读副本组成,通过流复制。
如何配置Tomcats DBCP以了解数据库集群中有多个不同的节点,从而将变异语句分配给主节点的连接和无副作用的语句(负载平衡)到任何从节点的连接?
作为PostgreSQL的JDBC驱动程序states的文档,可以在JDBC连接URL中声明多个节点:
jdbc:postgresql://host1:port1,host2:port2/database
因此,想法是在Tomcats server.xml中配置两个连接池。一个用于读/写主数据源的JNDI资源和另一个用于只读副本的池:jdbc:postgresql://host1:port1/database?targetServerType=master
和副本jdbc:postgresql://host1:port1,host2:port2/database?targetServerType=preferSlave&loadBalanceHosts=true
在这种情况下,在Tomcat上运行的应用程序需要知道有两个具有不同语义的数据库连接池,因此需要根据每个SQL语句决定从哪个池请求连接。这似乎是一个糟糕的模式,因为应用程序依赖于特定的数据库基础结构,JDBC池应该抽象底层数据库的实现。
在这种情况下,Tomcat DBCP和PostgreSQL集群之间的其他抽象层(如pgpool-II)是否有帮助? (特别是将来,基础架构增长到几个Tomcat服务器实例或者需要高可用性和PostgreSQL DB的故障转移)