最近发现在做Java项目时,获取数据库连接,分别进行了2次不同的查询,在第二次查询之前将数据库进行更新,执行查询后获取不到最新的数据信息。
针对这个问题,大多人首先考虑的是缓存问题,然而禁止了一级缓存和二级缓存仍然解决不了目前的问题。这时候多数人不知道如何下手了,针对这个问题应该如何解决呢?
首先hibernate自带的缓存机制,做的还不够完善,不能实时获取最新的数据信息,你可以考虑换一个与数据库交互的连接,比如c3p0或者bonecp,配置如下:
C3P0配置:
需要导入3个jar包,分别是:c3p0-0.9.2.1.jar hibernate-c3p0-4.3.5.Final.jar
mchange-commons-java-0.2.3.4.jar
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="minPoolSize" value="10" /> //在连接池中可用数据库连接的最小数目
<property name="maxPoolSize" value="100" /> //在连接池中所有数据库连接的最大数目
<property name="maxIdleTime" value="120" /> //最大空闲时间,120秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
<property name="acquireIncrement" value="3" /> //当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3
<property name="maxStatements" value="50" /> //可以被缓存的PreparedStatement的最大数目
<property name="initialPoolSize" value="20" /> //初始化时获取连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3
<property name="idleConnectionTestPeriod" value="60" /> //每60秒检查所有连接池中的空闲连接。Default: 0
<property name="acquireRetryAttempts" value="30" /> //定义在从数据库获取新连接失败后重复尝试的次数。Default: 30
<property name="breakAfterAcquireFailure" value="true"/>
<property name="testConnectionOnCheckout" value="false"/>
</bean>
BoneCP配置如下:
需要导入的jar包: bonecp-0.7.1.RELEASE.jar google-collections-1.0.jar,slf4j-api-1.5.8.jar,slf4j-log4j12-1.5.6.jar和slf4j-simple-1.5.8.jar
<bean id="dataSource" class="com.jolbox.bonecp.BoneCPDataSource" destroy-method="close">
<property name="driverClass" value="${jdbc.driverClass}" />
<property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="idleConnectionTestPeriod" value="${bonecp.idleConnectionTestPeriod}"/>
<property name="idleMaxAge" value="${bonecp.idleMaxAge}"/>
<property name="maxConnectionsPerPartition" value="${bonecp.maxConnectionsPerPartition}"/>
<property name="minConnectionsPerPartition" value="${bonecp.minConnectionsPerPartition}"/>
<property name="partitionCount" value="${bonecp.partitionCount}"/>
<property name="acquireIncrement" value="${bonecp.acquireIncrement}"/>
<property name="statementsCacheSize" value="${bonecp.statementsCacheSize}"/>
<property name="releaseHelperThreads" value="${bonecp.releaseHelperThreads}"/>
</bean>
通过C3P0 和 BoneCP连接数据库能够实时获取到数据库的最新数据信息了。
然而还有一些例外情况,仍然获取不到数据库的最新数据信息,现在有两种解决方式:
第一种:断开与数据库连接的session,在执行查询,实验证明是可以获取到最新数据信息,如下:
Session session=sessionFactory.getCurrentSession();
session.disconnect();
Map<String,String> paramMap=new FastMap().newHashMap().set("conid", list.get(0));
MsRealdata realdata=selSer.findOne("realdata.findMsRealdata",null);
Connection conn=DBManager.getConnection();
session.reconnect(DBManager.getConnection());
conn.setAutoCommit(false);
其中先断开session连接一个很短暂的时间,执行查询之后再连接上,realdata获取的是最新的数据信息。
第二种:需要从数据库入手,以Mysql数据库为例
执行一个查询
mysql> show variables
like
'%iso%'
;
+
---------------+-----------------+
| Variable_name | Value |
+
---------------+-----------------+
| tx_isolation |
REPEATABLE
-
READ
|
+
---------------+-----------------+
1 row
in
set
(0.00 sec)
如果是上面这样的,执行下面的SQL
mysql>
set
global
TRANSACTION
ISOLATION
LEVEL
READ
COMMITTED
;
Query OK, 0
rows
affected (0.00 sec)
再次执行查询
mysql> show variables
like
'%iso%'
;
+
---------------+-----------------+
| Variable_name | Value |
+
---------------+-----------------+
| tx_isolation |
REPEATABLE
-
READ
|
+
---------------+-----------------+
1 row
in
set
(0.00 sec)
mysql> show
global
variables
like
'%iso%'
;
+
---------------+----------------+
| Variable_name | Value |
+
---------------+----------------+
| tx_isolation |
READ
-
COMMITTED
|
+
---------------+----------------+
1 row
in
set
(0.00 sec)
如果改变后的结果如上,则恭喜你,解决问题了。
相关推荐
在计算机科学领域,数据库是存储和管理信息的核心工具,而数据查询则是获取、操作这些信息的主要手段。本实验报告旨在通过实际操作加深对数据库和数据查询的理解,提高在学习过程中对数据库操作的熟练度。 2.1 需求...
标题中的“8e数据 16e数据库 数据在线查询”涉及到的是关于数据库管理和在线查询的知识。8e和16e可能是指两种特定的数据集或数据库系统,而“数据在线查询”指的是通过网络接口进行数据检索的能力。在这个场景下,...
查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA...
数据库数据展示 <!-- 引入必要的CSS和JS --> ($data as $row): ?> ($row as $field): ?> <td><?php echo $field; ?> ; ?> ; ?> ``` 在实际应用中,我们可能需要考虑性能优化,如分页、缓存和避免SQL...
获取连接后,需要执行 SQL 查询以获取数据库数据。在这里,我们使用了 reqBean.getDataSyncExecInfo().getSql() 方法来获取 SQL 语句,该语句将被执行以获取数据库数据。然后,我们使用 Statement 对象来执行查询,...
系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据。常用的与元数据有关的系统存储过程有 sp_columns、sp_databases、sp_fkeys、sp_pkeys、...
C#连接Oracle数据库(查询数据)方法,好东西,分享一下
`ListView下拉刷新获取数据库数据`这个主题涉及到了ListView的交互更新以及如何从数据库中动态加载数据。在这个场景中,用户通过下拉ListView的动作触发刷新操作,系统则从数据库中获取新的数据并更新到ListView上,...
C#使用PISDK连接PI数据库,获取测点、历史数据、快照数据
在LabVIEW中与数据库交互是常见的需求,本教程将详细介绍如何使用LabVIEW进行数据库的表格创建、数据更新、数据删除、数据查询以及数据插入,并展示如何显示这些数据。 首先,我们需要理解LabVIEW中的数据库接口。...
在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....
在IT领域,数据库是存储和管理数据的核心工具,而连接数据库和执行查询是任何数据驱动应用程序的基础。这个练习旨在帮助你熟悉这一过程,让你能够熟练地从数据库中获取所需信息。我们将探讨以下知识点: 1. **...
不过,基础的SQL功能在大多数数据库中都能通用,只有特定的扩展功能可能存在兼容性问题。 本教程将具体讨论如何在ACCESS数据库中按照时间段查询数据。首先,我们需要了解数据库的结构,例如一个名为“商品”的表,...
本示例将详细介绍如何使用JDBC连接到PostgreSQL数据库并执行简单的数据获取操作。PostgreSQL是一种开源的对象关系型数据库管理系统,因其强大的功能和稳定性而广受欢迎。 首先,确保已安装PostgreSQL数据库并在系统...
在本场景中,我们将探讨如何使用Node.js连接MySQL数据库,获取数据,并将这些数据返回到前端页面,如HTML5(H5)网页。以下是详细的知识点讲解: 1. **Node.js**:Node.js是基于Chrome V8引擎的JavaScript运行环境...
根据提供的文件信息,我们可以深入探讨AEW的组态王数据库KVADODBGRID控件关于查询、排序、数据删除例程的关键技术点。 ### 一、例程概述 本例程基于KINGVIEW 6.53开发环境,通过具体的应用案例来实现一系列的功能...
在IT行业中,数据库数据查询是核心任务之一,特别是在大数据时代,高效、准确地获取和处理信息至关重要。"两个数据库数据查询"这个主题涉及到如何在不同的数据库系统之间进行数据交互和同步,这对于数据整合、分析...
在Qt框架中,显示数据库表中的数据通常涉及到多个步骤,包括连接数据库、执行查询语句、将查询结果映射到TableView组件以及自定义数据...通过理解并掌握这些内容,你就能在Qt应用程序中有效地展示和操作数据库数据了。
3. **结果集处理**:研究程序如何获取并显示查询结果,以及如何处理大量数据。 4. **异常处理和错误报告**:理解程序如何处理可能出现的错误,提供有用的错误信息。 5. **用户权限和安全**:探究代码如何实现用户...
达梦数据库数据量统计.sql