在 tomcat 服务器上使用连接池时的数据同步问题

Posted

技术标签:

【中文标题】在 tomcat 服务器上使用连接池时的数据同步问题【英文标题】:Data synchronization issue when use connection pool on tomcat server 【发布时间】:2014-03-11 12:02:34 【问题描述】:

我正在开发一个 Servlet 应用程序。它从Tomcat容器支持的连接池中获取数据库连接,用于查询和更新数据库数据。

我遇到了问题。 Servlet 获取数据库连接,然后添加新表行或删除表行。之后,它提交更改。稍后,获得连接以执行查询。我发现使用第二个连接从查询返回的数据没有反映第一个数据库连接所做的更改。

这不奇怪吗?使用第一个数据库连接所做的更改已成功提交。为什么插入的新行没有出现在后面的查询中?为什么删除的行仍然出现在后面的查询中?

是否与事务级别的设置有关?

谁能帮忙?

03-12:更多信息(#1):

    我使用 mysql Community Server 5.6。 我的 servlet 在 Tomcat 7.0.41.0 上运行。 conf/server.xml 中的 Resource 元素如下:
    <Resource type="javax.sql.DataSource"
           name="jdbc/storewscloud"
           factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
           driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/myappdb"
       maxActive="100"
            minIdle="10"
            maxWait="10000"
            initialSize="10"
            removeAbandonedTimeout="60"
           removeAbandoned="true"
           logAbandoned="true"
           username="root"
           password="xxxxxxxxxx"
    /></li>
    

    我没有明确使用任何缓存。 每次 servlet 获得数据库连接时,它都会关闭连接的自动提交模式。 调用 servlet 时,将获得数据库连接。 servet 使用它来更新数据库中的数据。之后,它会提交更改。然后,它使用 Apache HttpClients 调用同一个 servlet 来做一些其他事情,这也获得了数据库连接并执行查询。后面的查询返回“旧”数据。如果我刷新网页,则会显示最新数据。看起来像是某个方,mysql jdbc 驱动程序或连接对象,将数据缓存在某处。我不知道。
03-12:更多信息(#2): 我做了一个实验,在不使用连接池的情况下获得连接。结果是正确的。所以,问题是由连接池引起的。

要使查询使用池中的第二个连接返回正确的数据,我不仅需要使用池中的第一个连接提交数据更改,还需要关闭第一个连接。

看起来所做的数据更改并没有完全保存在数据库中,即使调用了 commit(),直到调用了 close()。

为什么?

【问题讨论】:

直接查询数据库是否存在更新记录?是否正在进行任何缓存?你确定你的提交有效吗? 你使用的是哪个连接池(Tomcat有2个)?你的数据库是什么?你的事务隔离级别是多少?你在使用自动提交吗?没有发生错误? 我今天更新了我的问题,如上所示。感谢 cmets。 【参考方案1】:

我发现最近发布了一个新版本的C3P0连接池。我试了一下。有用!我遇到的问题没有发生。因此,我用它来代替Tomcat服务器的捆绑连接池。对于那些和我遇到同样问题的人来说,C3P0 或许也适合你。

C3P0 Project URL

【讨论】:

以上是关于在 tomcat 服务器上使用连接池时的数据同步问题的主要内容,如果未能解决你的问题,请参考以下文章

JSP Tomcat8.0运行连接池时发生异常AbstractMethodError oracle.jdbc.driver.T4CConnection.isValid(I)Z

Unity 游戏框架搭建 (二十一) 使用对象池时的一些细节

IIS 回收应用程序池时如何保持 Blazor 服务器连接处于活动状态

在 .NET Core/.NET 5+ 中使用 TransactionScope 和 SQL 连接池时如何避免 PlatformNotSupportedException

整合多数据源Neo连接池时遇见的问题以及方案与收获

连接断开原因