最近发现在做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)
如果改变后的结果如上,则恭喜你,解决问题了。
相关推荐
查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA实用技巧范例下载查询获取Access数据库数据.zip源码EXCEL VBA宏编程Excel VBA...
C#连接Oracle数据库(查询数据)方法,好东西,分享一下
C#使用PISDK连接PI数据库,获取测点、历史数据、快照数据
获取指定数据库所有表及数据,以表格显示,具体说在demo目录下
使用eclipse获取mysql数据库中的表结构以及主外键
如何获取SQLServer数据库元数据的方法[文].pdf
达梦数据库数据量统计.sql
用highcharts实现从mysql数据库获取数据生成实时折线图。开发平台是用eclipse实现的,是一个项目,用jsp显示从数据库读取的实时折线图。
kettle通过java脚本获取数据库的值..................................................................
java多线程并发查询数据库,使用线程池控制分页,并发查询。
实用实用实用实用实用实用实用实用实用实用实用实用实用实用实用实用
c# 动态获得数据库中所有查询和视图 c# 视图信息 c# 存储过程信息
C#读取数据库日期数据,选择性显示时间的部分 如显示年月、年月日、时分秒等等
我们在使用ListView的时候需要和数据进行绑定,那么问题来了,如何获取SQLite数据库中的数据并动态的显示到ListView当中呢?其实过程很简单:首先要获取SQLite数据(当然首先你要创建一个SQLite数据库并填写了一些...
.C++获取SQL Server数据库内容
SQL中获取数据库中所有表的所有列名的方法 可以查询数据库中的某个列明,也可查询数据库中所有的列名
本文实例讲述了PHP实现在数据库百万条数据中随机获取20条记录的方法。分享给大家供大家参考,具体如下: 额,为什么要写这个? 在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法的吗?又不是...
Java连接查询数据库代码,可以了解下加载驱动器、获取连接、获取Statement对象、执行查询、遍历ResultSet、获取数据、在控制台输出数据、输出出错信息等方面的小技巧。Class.forName(...
数据库元数据核心部分,该部分完全独立,不依赖任何第三方,获取元数据部分的代码参考了MyBatis Generator。 如果你要连接数据库,需要有该数据库的JDBC驱动 DBMetadata-generator 利用数据库元数据,根据模板生成...
MYSQL的一个demo,可以通过VB语言运行界面来获取数据库的表格和内容,并且可以修改数据库内容及上传。