`
yang__yuan
  • 浏览: 28168 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类

关于查询不能获取数据库最新数据问题

 
阅读更多

最近发现在做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)

 

如果改变后的结果如上,则恭喜你,解决问题了。   

 

分享到:
评论
1 楼 yang__yuan 2016-03-11  
    

相关推荐

    数据库 数据查询实验报告

    在计算机科学领域,数据库是存储和管理信息的核心工具,而数据查询则是获取、操作这些信息的主要手段。本实验报告旨在通过实际操作加深对数据库和数据查询的理解,提高在学习过程中对数据库操作的熟练度。 2.1 需求...

    8e数据 16e数据库 数据在线查询

    标题中的“8e数据 16e数据库 数据在线查询”涉及到的是关于数据库管理和在线查询的知识。8e和16e可能是指两种特定的数据集或数据库系统,而“数据在线查询”指的是通过网络接口进行数据检索的能力。在这个场景下,...

    查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载

    查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA...

    获取指定数据库所有数据信息

    数据库数据展示 &lt;!-- 引入必要的CSS和JS --&gt; ($data as $row): ?&gt; ($row as $field): ?&gt; &lt;td&gt;&lt;?php echo $field; ?&gt; ; ?&gt; ; ?&gt; ``` 在实际应用中,我们可能需要考虑性能优化,如分页、缓存和避免SQL...

    java使用jdbc将数据库数据导出到csv文件.pdf

    获取连接后,需要执行 SQL 查询以获取数据库数据。在这里,我们使用了 reqBean.getDataSyncExecInfo().getSql() 方法来获取 SQL 语句,该语句将被执行以获取数据库数据。然后,我们使用 Statement 对象来执行查询,...

    如何获取SQLServer数据库元数据的方法[文].pdf

    系统存储过程与系统函数在系统表和元数据之间提供了一个抽象层,使得我们不用直接查询系统表就能获得当前数据库对象的元数据。常用的与元数据有关的系统存储过程有 sp_columns、sp_databases、sp_fkeys、sp_pkeys、...

    C#连接Oracle数据库(查询数据)

    C#连接Oracle数据库(查询数据)方法,好东西,分享一下

    ListView下拉刷新获取数据库数据

    `ListView下拉刷新获取数据库数据`这个主题涉及到了ListView的交互更新以及如何从数据库中动态加载数据。在这个场景中,用户通过下拉ListView的动作触发刷新操作,系统则从数据库中获取新的数据并更新到ListView上,...

    C#连接PI数据库获取历史数据和快照数据

    C#使用PISDK连接PI数据库,获取测点、历史数据、快照数据

    labview 数据库的表格创建,数据更新,数据删除,数据查询,数据插入,数据显示。

    在LabVIEW中与数据库交互是常见的需求,本教程将详细介绍如何使用LabVIEW进行数据库的表格创建、数据更新、数据删除、数据查询以及数据插入,并展示如何显示这些数据。 首先,我们需要理解LabVIEW中的数据库接口。...

    java多线程查询数据库

    在Java编程中,多线程查询数据库是一种常见的优化策略,特别是在处理大数据量或者需要并行执行多个查询时。本文将详细探讨如何利用Java的多线程技术和线程池来实现并发查询数据库,以及相关的文件`BatchDataUtil....

    练习:连接数据库并查询数据

    在IT领域,数据库是存储和管理数据的核心工具,而连接数据库和执行查询是任何数据驱动应用程序的基础。这个练习旨在帮助你熟悉这一过程,让你能够熟练地从数据库中获取所需信息。我们将探讨以下知识点: 1. **...

    使用LabVIEW操作ACCESS、MySQL、SQL server数据库实现按照时间段查询数据

    不过,基础的SQL功能在大多数数据库中都能通用,只有特定的扩展功能可能存在兼容性问题。 本教程将具体讨论如何在ACCESS数据库中按照时间段查询数据。首先,我们需要了解数据库的结构,例如一个名为“商品”的表,...

    JDBC 连接到 PostgreSQL 数据库获取数据简单例子

    本示例将详细介绍如何使用JDBC连接到PostgreSQL数据库并执行简单的数据获取操作。PostgreSQL是一种开源的对象关系型数据库管理系统,因其强大的功能和稳定性而广受欢迎。 首先,确保已安装PostgreSQL数据库并在系统...

    node连接数据库获取内容,把数据返回到前台页面

    在本场景中,我们将探讨如何使用Node.js连接MySQL数据库,获取数据,并将这些数据返回到前端页面,如HTML5(H5)网页。以下是详细的知识点讲解: 1. **Node.js**:Node.js是基于Chrome V8引擎的JavaScript运行环境...

    AEW的组态王数据库KVADODBGRID控件关于查询、排序、数据删除例程

    根据提供的文件信息,我们可以深入探讨AEW的组态王数据库KVADODBGRID控件关于查询、排序、数据删除例程的关键技术点。 ### 一、例程概述 本例程基于KINGVIEW 6.53开发环境,通过具体的应用案例来实现一系列的功能...

    两个数据库数据查询 1

    在IT行业中,数据库数据查询是核心任务之一,特别是在大数据时代,高效、准确地获取和处理信息至关重要。"两个数据库数据查询"这个主题涉及到如何在不同的数据库系统之间进行数据交互和同步,这对于数据整合、分析...

    qt TableView显示数据库表中的数据

    在Qt框架中,显示数据库表中的数据通常涉及到多个步骤,包括连接数据库、执行查询语句、将查询结果映射到TableView组件以及自定义数据...通过理解并掌握这些内容,你就能在Qt应用程序中有效地展示和操作数据库数据了。

    数据库 万能查询程序源代码

    3. **结果集处理**:研究程序如何获取并显示查询结果,以及如何处理大量数据。 4. **异常处理和错误报告**:理解程序如何处理可能出现的错误,提供有用的错误信息。 5. **用户权限和安全**:探究代码如何实现用户...

    达梦数据库数据量统计.sql

    达梦数据库数据量统计.sql

Global site tag (gtag.js) - Google Analytics